##// END OF EJS Templates
* single/multiple issues pdf export added...
Jean-Philippe Lang -
r35:51e0989c4919
parent child
Show More
@@ -0,0 +1,43
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 require 'iconv'
19
20 module IfpdfHelper
21
22 class IFPDF < FPDF
23
24 def Cell(w,h=0,txt='',border=0,ln=0,align='',fill=0,link='')
25 @ic ||= Iconv.new('ISO-8859-1', 'UTF-8')
26 super w,h,@ic.iconv(txt),border,ln,align,fill,link
27 end
28
29 def MultiCell(w,h,txt,border=0,align='J',fill=0)
30 @ic ||= Iconv.new('ISO-8859-1', 'UTF-8')
31 super w,h,txt,border,align,fill
32 end
33
34 def Footer
35 SetY(-15)
36 SetX(-30)
37 SetFont('Helvetica', 'I', 8)
38 Cell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
39 end
40
41 end
42
43 end
@@ -0,0 +1,95
1 <% pdf.SetFont('Arial','B',11)
2 pdf.Cell(190,10, "#{issue.project.name} - #{issue.tracker.name} # #{issue.long_id} - #{issue.subject}")
3 pdf.Ln
4
5 y0 = pdf.GetY
6
7 pdf.SetFont('Arial','B',9)
8 pdf.Cell(35,5, l(:field_status) + ":","LT")
9 pdf.SetFont('Arial','',9)
10 pdf.Cell(60,5, issue.status.name,"RT")
11 pdf.SetFont('Arial','B',9)
12 pdf.Cell(35,5, l(:field_priority) + ":","LT")
13 pdf.SetFont('Arial','',9)
14 pdf.Cell(60,5, issue.priority.name,"RT")
15 pdf.Ln
16
17 pdf.SetFont('Arial','B',9)
18 pdf.Cell(35,5, l(:field_author) + ":","L")
19 pdf.SetFont('Arial','',9)
20 pdf.Cell(60,5, issue.author.name,"R")
21 pdf.SetFont('Arial','B',9)
22 pdf.Cell(35,5, l(:field_category) + ":","L")
23 pdf.SetFont('Arial','',9)
24 pdf.Cell(60,5, (issue.category ? issue.category.name : "-"),"R")
25 pdf.Ln
26
27 pdf.SetFont('Arial','B',9)
28 pdf.Cell(35,5, l(:field_created_on) + ":","L")
29 pdf.SetFont('Arial','',9)
30 pdf.Cell(60,5, format_date(issue.created_on),"R")
31 pdf.SetFont('Arial','B',9)
32 pdf.Cell(35,5, l(:field_assigned_to) + ":","L")
33 pdf.SetFont('Arial','',9)
34 pdf.Cell(60,5, (issue.assigned_to ? issue.assigned_to.name : "-"),"R")
35 pdf.Ln
36
37 pdf.SetFont('Arial','B',9)
38 pdf.Cell(35,5, l(:field_updated_on) + ":","LB")
39 pdf.SetFont('Arial','',9)
40 pdf.Cell(60,5, format_date(issue.updated_on),"RB")
41 pdf.SetFont('Arial','B',9)
42 pdf.Cell(35,5, l(:field_due_date) + ":","LB")
43 pdf.SetFont('Arial','',9)
44 pdf.Cell(60,5, format_date(issue.due_date),"RB")
45 pdf.Ln
46
47 for custom_value in issue.custom_values
48 pdf.SetFont('Arial','B',9)
49 pdf.Cell(35,5, custom_value.custom_field.name + ":","L")
50 pdf.SetFont('Arial','',9)
51 pdf.MultiCell(155,5, (show_value custom_value),"R")
52 end
53
54 pdf.SetFont('Arial','B',9)
55 pdf.Cell(35,5, l(:field_subject) + ":","LTB")
56 pdf.SetFont('Arial','',9)
57 pdf.Cell(155,5, issue.subject,"RTB")
58 pdf.Ln
59
60 pdf.SetFont('Arial','B',9)
61 pdf.Cell(35,5, l(:field_description) + ":")
62 pdf.SetFont('Arial','',9)
63 pdf.MultiCell(155,5, issue.description,"BR")
64
65 pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
66 pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
67
68 pdf.Ln
69 pdf.SetFont('Arial','B',9)
70 pdf.Cell(190,5, l(:label_history),"B")
71 pdf.Ln
72 for history in issue.histories.find(:all, :include => [:author, :status])
73 pdf.SetFont('Arial','B',8)
74 pdf.Cell(100,5, history.status.name)
75 pdf.SetFont('Arial','',8)
76 pdf.Cell(20,5, format_date(history.created_on))
77 pdf.Cell(70,5, history.author.name,0,0,"R")
78 pdf.SetFont('Arial','',8)
79 pdf.Ln
80 pdf.Cell(10,4, "") and pdf.MultiCell(180,4, history.notes) if history.notes?
81 end
82 pdf.Ln
83
84 pdf.SetFont('Arial','B',9)
85 pdf.Cell(190,5, l(:label_attachment_plural), "B")
86 pdf.Ln
87 for attachment in issue.attachments
88 pdf.SetFont('Arial','',8)
89 pdf.Cell(80,5, attachment.filename)
90 pdf.Cell(20,5, human_size(attachment.filesize))
91 pdf.Cell(20,5, format_date(attachment.created_on))
92 pdf.Cell(70,5, attachment.author.name,0,0,"R")
93 pdf.Ln
94 end
95 %> No newline at end of file
@@ -0,0 +1,8
1 <% pdf=IfpdfHelper::IFPDF.new
2 pdf.AliasNbPages
3 pdf.AddPage
4
5 render :partial => 'issues/pdf', :locals => { :pdf => pdf, :issue => @issue }
6 %>
7
8 <%= pdf.Output %> No newline at end of file
@@ -0,0 +1,3
1 Issue #<%= @issue.id %> has been reported.
2 ----------------------------------------
3 <%= render :file => "_issue", :use_full_path => true, :locals => { :issue => @issue } %> No newline at end of file
@@ -0,0 +1,3
1 Issue #<%= @issue.id %> has been reported.
2 ----------------------------------------
3 <%= render :file => "_issue", :use_full_path => true, :locals => { :issue => @issue } %> No newline at end of file
@@ -0,0 +1,3
1 Issue #<%= @issue.id %> has been updated to "<%= @issue.status.name %>" status.
2 ----------------------------------------
3 <%= render :file => "_issue", :use_full_path => true, :locals => { :issue => @issue } %> No newline at end of file
@@ -0,0 +1,3
1 Issue #<%= @issue.id %> has been updated to "<%= @issue.status.name %>" status.
2 ----------------------------------------
3 <%= render :file => "_issue", :use_full_path => true, :locals => { :issue => @issue } %> No newline at end of file
@@ -0,0 +1,3
1 To change your password, use the following link:
2
3 http://<%= $RDM_HOST_NAME %>/account/lost_password?token=<%= @token.value %> No newline at end of file
@@ -0,0 +1,3
1 To change your password, use the following link:
2
3 http://<%= $RDM_HOST_NAME %>/account/lost_password?token=<%= @token.value %> No newline at end of file
@@ -0,0 +1,3
1 To activate your redMine account, use the following link:
2
3 http://<%= $RDM_HOST_NAME %>/account/register?token=<%= @token.value %> No newline at end of file
@@ -0,0 +1,3
1 To activate your redMine account, use the following link:
2
3 http://<%= $RDM_HOST_NAME %>/account/register?token=<%= @token.value %> No newline at end of file
@@ -0,0 +1,10
1 <% pdf=IfpdfHelper::IFPDF.new
2 pdf.AliasNbPages
3 pdf.AddPage
4 @issues.each {|i|
5 render :partial => 'issues/pdf', :locals => { :pdf => pdf, :issue => i }
6 pdf.AddPage
7 }
8 %>
9
10 <%= pdf.Output %> No newline at end of file
@@ -0,0 +1,11
1 class ExportPdf < ActiveRecord::Migration
2 def self.up
3 Permission.create :controller => "projects", :action => "export_issues_pdf", :description => "label_export_pdf", :sort => 1002, :is_public => true, :mail_option => 0, :mail_enabled => 0
4 Permission.create :controller => "issues", :action => "export_pdf", :description => "label_export_pdf", :sort => 1015, :is_public => true, :mail_option => 0, :mail_enabled => 0
5 end
6
7 def self.down
8 Permission.find(:first, :conditions => ["controller=? and action=?", 'projects', 'export_issues_pdf']).destroy
9 Permission.find(:first, :conditions => ["controller=? and action=?", 'issues', 'export_pdf']).destroy
10 end
11 end
@@ -1,107 +1,107
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class ApplicationController < ActionController::Base
19 19 before_filter :check_if_login_required, :set_localization
20 20
21 21 def logged_in_user=(user)
22 22 @logged_in_user = user
23 23 session[:user_id] = (user ? user.id : nil)
24 24 end
25 25
26 26 def logged_in_user
27 27 if session[:user_id]
28 28 @logged_in_user ||= User.find(session[:user_id], :include => :memberships)
29 29 else
30 30 nil
31 31 end
32 32 end
33 33
34 34 # check if login is globally required to access the application
35 35 def check_if_login_required
36 36 require_login if $RDM_LOGIN_REQUIRED
37 37 end
38 38
39 39 def set_localization
40 40 lang = begin
41 41 if self.logged_in_user and self.logged_in_user.language and !self.logged_in_user.language.empty? and GLoc.valid_languages.include? self.logged_in_user.language.to_sym
42 42 self.logged_in_user.language
43 43 elsif request.env['HTTP_ACCEPT_LANGUAGE']
44 44 accept_lang = HTTPUtils.parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.split('-').first
45 45 if accept_lang and !accept_lang.empty? and GLoc.valid_languages.include? accept_lang.to_sym
46 46 accept_lang
47 47 end
48 48 end
49 49 rescue
50 50 nil
51 51 end || $RDM_DEFAULT_LANG
52 52 set_language_if_valid(lang)
53 53 end
54 54
55 55 def require_login
56 56 unless self.logged_in_user
57 57 store_location
58 58 redirect_to :controller => "account", :action => "login"
59 59 return false
60 60 end
61 61 true
62 62 end
63 63
64 64 def require_admin
65 65 return unless require_login
66 66 unless self.logged_in_user.admin?
67 67 render :nothing => true, :status => 403
68 68 return false
69 69 end
70 70 true
71 71 end
72 72
73 73 # authorizes the user for the requested action.
74 74 def authorize
75 75 # check if action is allowed on public projects
76 76 if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ @params[:controller], @params[:action] ]
77 77 return true
78 78 end
79 79 # if action is not public, force login
80 80 return unless require_login
81 81 # admin is always authorized
82 82 return true if self.logged_in_user.admin?
83 83 # if not admin, check membership permission
84 84 @user_membership ||= Member.find(:first, :conditions => ["user_id=? and project_id=?", self.logged_in_user.id, @project.id])
85 85 if @user_membership and Permission.allowed_to_role( "%s/%s" % [ @params[:controller], @params[:action] ], @user_membership.role_id )
86 86 return true
87 87 end
88 88 render :nothing => true, :status => 403
89 89 false
90 90 end
91
91
92 92 # store current uri in session.
93 93 # return to this location by calling redirect_back_or_default
94 94 def store_location
95 95 session[:return_to] = @request.request_uri
96 96 end
97 97
98 98 # move to the last store_location call or to the passed default one
99 99 def redirect_back_or_default(default)
100 100 if session[:return_to].nil?
101 101 redirect_to default
102 102 else
103 103 redirect_to_url session[:return_to]
104 104 session[:return_to] = nil
105 105 end
106 106 end
107 107 end No newline at end of file
@@ -1,120 +1,128
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class IssuesController < ApplicationController
19 layout 'base'
19 layout 'base', :except => :export_pdf
20 20 before_filter :find_project, :authorize
21 21
22 22 helper :custom_fields
23 23 include CustomFieldsHelper
24 helper :ifpdf
25 include IfpdfHelper
24 26
25 27 def show
26 28 @status_options = @issue.status.workflows.find(:all, :include => :new_status, :conditions => ["role_id=? and tracker_id=?", self.logged_in_user.role_for_project(@project.id), @issue.tracker.id]).collect{ |w| w.new_status } if self.logged_in_user
27 29 @custom_values = @issue.custom_values.find(:all, :include => :custom_field)
30 end
31
32 def export_pdf
33 @custom_values = @issue.custom_values.find(:all, :include => :custom_field)
34 @options_for_rfpdf ||= {}
35 @options_for_rfpdf[:file_name] = "#{@project.name}_#{@issue.long_id}.pdf"
28 36 end
29 37
30 38 def edit
31 39 @priorities = Enumeration::get_values('IPRI')
32 40 if request.get?
33 41 @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| @issue.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x, :customized => @issue) }
34 42 else
35 43 begin
36 44 # Retrieve custom fields and values
37 45 @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
38 46 @issue.custom_values = @custom_values
39 47 @issue.attributes = params[:issue]
40 48 if @issue.save
41 49 flash[:notice] = l(:notice_successful_update)
42 50 redirect_to :action => 'show', :id => @issue
43 51 end
44 52 rescue ActiveRecord::StaleObjectError
45 53 # Optimistic locking exception
46 54 flash[:notice] = l(:notice_locking_conflict)
47 55 end
48 56 end
49 57 end
50 58
51 59 def add_note
52 60 unless params[:history][:notes].empty?
53 61 @history = @issue.histories.build(params[:history])
54 62 @history.author_id = self.logged_in_user.id if self.logged_in_user
55 63 @history.status = @issue.status
56 64 if @history.save
57 65 flash[:notice] = l(:notice_successful_update)
58 66 redirect_to :action => 'show', :id => @issue
59 67 return
60 68 end
61 69 end
62 70 show
63 71 render :action => 'show'
64 72 end
65 73
66 74 def change_status
67 75 @history = @issue.histories.build(params[:history])
68 76 @status_options = @issue.status.workflows.find(:all, :conditions => ["role_id=? and tracker_id=?", self.logged_in_user.role_for_project(@project.id), @issue.tracker.id]).collect{ |w| w.new_status } if self.logged_in_user
69 77 if params[:confirm]
70 78 begin
71 79 @history.author_id = self.logged_in_user.id if self.logged_in_user
72 80 @issue.status = @history.status
73 81 @issue.fixed_version_id = (params[:issue][:fixed_version_id])
74 82 @issue.assigned_to_id = (params[:issue][:assigned_to_id])
75 83 @issue.lock_version = (params[:issue][:lock_version])
76 84 if @issue.save
77 85 flash[:notice] = l(:notice_successful_update)
78 86 Mailer.deliver_issue_change_status(@issue) if Permission.find_by_controller_and_action(@params[:controller], @params[:action]).mail_enabled?
79 87 redirect_to :action => 'show', :id => @issue
80 88 end
81 89 rescue ActiveRecord::StaleObjectError
82 90 # Optimistic locking exception
83 91 flash[:notice] = l(:notice_locking_conflict)
84 92 end
85 93 end
86 94 @assignable_to = @project.members.find(:all, :include => :user).collect{ |m| m.user }
87 95 end
88 96
89 97 def destroy
90 98 @issue.destroy
91 99 redirect_to :controller => 'projects', :action => 'list_issues', :id => @project
92 100 end
93 101
94 102 def add_attachment
95 103 # Save the attachment
96 104 if params[:attachment][:file].size > 0
97 105 @attachment = @issue.attachments.build(params[:attachment])
98 106 @attachment.author_id = self.logged_in_user.id if self.logged_in_user
99 107 @attachment.save
100 108 end
101 109 redirect_to :action => 'show', :id => @issue
102 110 end
103 111
104 112 def destroy_attachment
105 113 @issue.attachments.find(params[:attachment_id]).destroy
106 114 redirect_to :action => 'show', :id => @issue
107 115 end
108 116
109 117 # Send the file in stream mode
110 118 def download
111 119 @attachment = @issue.attachments.find(params[:attachment_id])
112 120 send_file @attachment.diskfile, :filename => @attachment.filename
113 121 end
114 122
115 123 private
116 124 def find_project
117 125 @issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
118 126 @project = @issue.project
119 127 end
120 128 end
@@ -1,334 +1,368
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class ProjectsController < ApplicationController
19 layout 'base'
19 layout 'base', :except => :export_issues_pdf
20 20 before_filter :find_project, :authorize, :except => [ :index, :list, :add ]
21 21 before_filter :require_admin, :only => [ :add, :destroy ]
22 22
23 23 helper :sort
24 24 include SortHelper
25 25 helper :search_filter
26 26 include SearchFilterHelper
27 27 helper :custom_fields
28 28 include CustomFieldsHelper
29
29 helper :ifpdf
30 include IfpdfHelper
31
30 32 def index
31 33 list
32 34 render :action => 'list' unless request.xhr?
33 35 end
34 36
35 37 # Lists public projects
36 38 def list
37 39 sort_init 'name', 'asc'
38 40 sort_update
39 41 @project_count = Project.count(["is_public=?", true])
40 42 @project_pages = Paginator.new self, @project_count,
41 43 15,
42 44 @params['page']
43 45 @projects = Project.find :all, :order => sort_clause,
44 46 :conditions => ["is_public=?", true],
45 47 :limit => @project_pages.items_per_page,
46 48 :offset => @project_pages.current.offset
47 49
48 50 render :action => "list", :layout => false if request.xhr?
49 51 end
50 52
51 53 # Add a new project
52 54 def add
53 55 @custom_fields = IssueCustomField.find(:all)
54 56 @root_projects = Project.find(:all, :conditions => "parent_id is null")
55 57 @project = Project.new(params[:project])
56 58 if request.get?
57 59 @custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project) }
58 60 else
59 61 @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
60 62 @custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project, :value => params["custom_fields"][x.id.to_s]) }
61 63 @project.custom_values = @custom_values
62 64 if @project.save
63 65 flash[:notice] = l(:notice_successful_create)
64 66 redirect_to :controller => 'admin', :action => 'projects'
65 67 end
66 68 end
67 69 end
68 70
69 71 # Show @project
70 72 def show
71 73 @custom_values = @project.custom_values.find(:all, :include => :custom_field)
72 74 @members = @project.members.find(:all, :include => [:user, :role])
73 75 @subprojects = @project.children if @project.children_count > 0
74 76 @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "news.created_on DESC")
75 77 @trackers = Tracker.find(:all)
76 78 end
77 79
78 80 def settings
79 81 @root_projects = Project::find(:all, :conditions => ["parent_id is null and id <> ?", @project.id])
80 82 @custom_fields = IssueCustomField::find_all
81 83 @issue_category ||= IssueCategory.new
82 84 @member ||= @project.members.new
83 85 @roles = Role.find_all
84 86 @users = User.find_all - @project.members.find(:all, :include => :user).collect{|m| m.user }
85 87 @custom_values ||= ProjectCustomField.find(:all).collect { |x| @project.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x) }
86 88 end
87 89
88 90 # Edit @project
89 91 def edit
90 92 if request.post?
91 93 @project.custom_fields = IssueCustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
92 94 if params[:custom_fields]
93 95 @custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project, :value => params["custom_fields"][x.id.to_s]) }
94 96 @project.custom_values = @custom_values
95 97 end
96 98 if @project.update_attributes(params[:project])
97 99 flash[:notice] = l(:notice_successful_update)
98 100 redirect_to :action => 'settings', :id => @project
99 101 else
100 102 settings
101 103 render :action => 'settings'
102 104 end
103 105 end
104 106 end
105 107
106 108 # Delete @project
107 109 def destroy
108 110 if request.post? and params[:confirm]
109 111 @project.destroy
110 112 redirect_to :controller => 'admin', :action => 'projects'
111 113 end
112 114 end
113 115
114 116 # Add a new issue category to @project
115 117 def add_issue_category
116 118 if request.post?
117 119 @issue_category = @project.issue_categories.build(params[:issue_category])
118 120 if @issue_category.save
119 121 flash[:notice] = l(:notice_successful_create)
120 122 redirect_to :action => 'settings', :id => @project
121 123 else
122 124 settings
123 125 render :action => 'settings'
124 126 end
125 127 end
126 128 end
127 129
128 130 # Add a new version to @project
129 131 def add_version
130 132 @version = @project.versions.build(params[:version])
131 133 if request.post? and @version.save
132 134 flash[:notice] = l(:notice_successful_create)
133 135 redirect_to :action => 'settings', :id => @project
134 136 end
135 137 end
136 138
137 139 # Add a new member to @project
138 140 def add_member
139 141 @member = @project.members.build(params[:member])
140 142 if request.post?
141 143 if @member.save
142 144 flash[:notice] = l(:notice_successful_create)
143 145 redirect_to :action => 'settings', :id => @project
144 146 else
145 147 settings
146 148 render :action => 'settings'
147 149 end
148 150 end
149 151 end
150 152
151 153 # Show members list of @project
152 154 def list_members
153 155 @members = @project.members
154 156 end
155 157
156 158 # Add a new document to @project
157 159 def add_document
158 160 @categories = Enumeration::get_values('DCAT')
159 161 @document = @project.documents.build(params[:document])
160 162 if request.post?
161 163 # Save the attachment
162 164 if params[:attachment][:file].size > 0
163 165 @attachment = @document.attachments.build(params[:attachment])
164 166 @attachment.author_id = self.logged_in_user.id if self.logged_in_user
165 167 end
166 168 if @document.save
167 169 flash[:notice] = l(:notice_successful_create)
168 170 redirect_to :action => 'list_documents', :id => @project
169 171 end
170 172 end
171 173 end
172 174
173 175 # Show documents list of @project
174 176 def list_documents
175 177 @documents = @project.documents
176 178 end
177 179
178 180 # Add a new issue to @project
179 181 def add_issue
180 182 @tracker = Tracker.find(params[:tracker_id])
181 183 @priorities = Enumeration::get_values('IPRI')
182 184 @issue = Issue.new(:project => @project, :tracker => @tracker)
183 185 if request.get?
184 186 @custom_values = @project.custom_fields_for_issues(@tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue) }
185 187 else
186 188 @issue.attributes = params[:issue]
187 189 @issue.author_id = self.logged_in_user.id if self.logged_in_user
188 190 # Create the document if a file was sent
189 191 if params[:attachment][:file].size > 0
190 192 @attachment = @issue.attachments.build(params[:attachment])
191 193 @attachment.author_id = self.logged_in_user.id if self.logged_in_user
192 194 end
193 195 @custom_values = @project.custom_fields_for_issues(@tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
194 196 @issue.custom_values = @custom_values
195 197 if @issue.save
196 198 flash[:notice] = l(:notice_successful_create)
197 199 Mailer.deliver_issue_add(@issue) if Permission.find_by_controller_and_action(@params[:controller], @params[:action]).mail_enabled?
198 200 redirect_to :action => 'list_issues', :id => @project
199 201 end
200 202 end
201 203 end
202 204
203 205 # Show filtered/sorted issues list of @project
204 206 def list_issues
205 207 sort_init 'issues.id', 'desc'
206 208 sort_update
207 209
208 210 search_filter_init_list_issues
209 211 search_filter_update if params[:set_filter]
210 212
213 @results_per_page_options = [ 15, 25, 50, 100 ]
214 if params[:per_page] and @results_per_page_options.include? params[:per_page].to_i
215 @results_per_page = params[:per_page].to_i
216 session[:results_per_page] = @results_per_page
217 else
218 @results_per_page = session[:results_per_page] || @results_per_page_options.first
219 end
220
211 221 @issue_count = Issue.count(:include => [:status, :project], :conditions => search_filter_clause)
212 @issue_pages = Paginator.new self, @issue_count, 15, @params['page']
222 @issue_pages = Paginator.new self, @issue_count, @results_per_page, @params['page']
213 223 @issues = Issue.find :all, :order => sort_clause,
214 224 :include => [ :author, :status, :tracker, :project ],
215 225 :conditions => search_filter_clause,
216 226 :limit => @issue_pages.items_per_page,
217 227 :offset => @issue_pages.current.offset
218 228
219 render :action => "list_issues", :layout => false if request.xhr?
229 render :layout => false if request.xhr?
220 230 end
221 231
222 232 # Export filtered/sorted issues list to CSV
223 233 def export_issues_csv
224 234 sort_init 'issues.id', 'desc'
225 235 sort_update
226 236
227 237 search_filter_init_list_issues
228 238
229 239 @issues = Issue.find :all, :order => sort_clause,
230 :include => [ :author, :status, :tracker, :project ],
240 :include => [ :author, :status, :tracker, :project, :custom_values ],
231 241 :conditions => search_filter_clause
232 242
243 ic = Iconv.new('ISO-8859-1', 'UTF-8')
233 244 export = StringIO.new
234 CSV::Writer.generate(export, ',') do |csv|
235 csv << %w(Id Status Tracker Subject Author Created Updated)
245 CSV::Writer.generate(export, l(:general_csv_separator)) do |csv|
246 # csv header fields
247 headers = [ "#", l(:field_status), l(:field_tracker), l(:field_subject), l(:field_author), l(:field_created_on), l(:field_updated_on) ]
248 for custom_field in @project.all_custom_fields
249 headers << custom_field.name
250 end
251 csv << headers.collect {|c| ic.iconv(c) }
252 # csv lines
236 253 @issues.each do |issue|
237 csv << [issue.id, issue.status.name, issue.tracker.name, issue.subject, issue.author.display_name, l_datetime(issue.created_on), l_datetime(issue.updated_on)]
254 fields = [issue.id, issue.status.name, issue.tracker.name, issue.subject, issue.author.display_name, l_datetime(issue.created_on), l_datetime(issue.updated_on)]
255 for custom_field in @project.all_custom_fields
256 fields << (show_value issue.custom_value_for(custom_field))
257 end
258 csv << fields.collect {|c| ic.iconv(c.to_s) }
238 259 end
239 260 end
240 261 export.rewind
241 send_data(export.read,
242 :type => 'text/csv; charset=utf-8; header=present',
243 :filename => 'export.csv')
262 send_data(export.read, :type => 'text/csv; header=present', :filename => 'export.csv')
263 end
264
265 # Export filtered/sorted issues to PDF
266 def export_issues_pdf
267 sort_init 'issues.id', 'desc'
268 sort_update
269
270 search_filter_init_list_issues
271
272 @issues = Issue.find :all, :order => sort_clause,
273 :include => [ :author, :status, :tracker, :project, :custom_values ],
274 :conditions => search_filter_clause
275
276 @options_for_rfpdf ||= {}
277 @options_for_rfpdf[:file_name] = "export.pdf"
244 278 end
245 279
246 280 def move_issues
247 281 @issues = @project.issues.find(params[:issue_ids]) if params[:issue_ids]
248 282 redirect_to :action => 'list_issues', :id => @project and return unless @issues
249 283 @projects = []
250 284 # find projects to which the user is allowed to move the issue
251 285 @logged_in_user.memberships.each {|m| @projects << m.project if Permission.allowed_to_role("projects/move_issues", m.role_id)}
252 286 # issue can be moved to any tracker
253 287 @trackers = Tracker.find(:all)
254 288 if request.post? and params[:new_project_id] and params[:new_tracker_id]
255 289 new_project = Project.find(params[:new_project_id])
256 290 new_tracker = Tracker.find(params[:new_tracker_id])
257 291 @issues.each { |i|
258 292 # category is project dependent
259 293 i.category = nil unless i.project_id == new_project.id
260 294 # move the issue
261 295 i.project = new_project
262 296 i.tracker = new_tracker
263 297 i.save
264 298 }
265 299 flash[:notice] = l(:notice_successful_update)
266 300 redirect_to :action => 'list_issues', :id => @project
267 301 end
268 302 end
269 303
270 304 # Add a news to @project
271 305 def add_news
272 306 @news = News.new(:project => @project)
273 307 if request.post?
274 308 @news.attributes = params[:news]
275 309 @news.author_id = self.logged_in_user.id if self.logged_in_user
276 310 if @news.save
277 311 flash[:notice] = l(:notice_successful_create)
278 312 redirect_to :action => 'list_news', :id => @project
279 313 end
280 314 end
281 315 end
282 316
283 317 # Show news list of @project
284 318 def list_news
285 319 @news_pages, @news = paginate :news, :per_page => 10, :conditions => ["project_id=?", @project.id], :include => :author, :order => "news.created_on DESC"
286 320 render :action => "list_news", :layout => false if request.xhr?
287 321 end
288 322
289 323 def add_file
290 324 if request.post?
291 325 # Save the attachment
292 326 if params[:attachment][:file].size > 0
293 327 @attachment = @project.versions.find(params[:version_id]).attachments.build(params[:attachment])
294 328 @attachment.author_id = self.logged_in_user.id if self.logged_in_user
295 329 if @attachment.save
296 330 flash[:notice] = l(:notice_successful_create)
297 331 redirect_to :controller => 'projects', :action => 'list_files', :id => @project
298 332 end
299 333 end
300 334 end
301 335 @versions = @project.versions
302 336 end
303 337
304 338 def list_files
305 339 @versions = @project.versions
306 340 end
307 341
308 342 # Show changelog for @project
309 343 def changelog
310 344 @trackers = Tracker.find(:all, :conditions => ["is_in_chlog=?", true])
311 345 if request.get?
312 346 @selected_tracker_ids = @trackers.collect {|t| t.id.to_s }
313 347 else
314 348 @selected_tracker_ids = params[:tracker_ids].collect { |id| id.to_i.to_s } if params[:tracker_ids] and params[:tracker_ids].is_a? Array
315 349 end
316 350 @selected_tracker_ids ||= []
317 351 @fixed_issues = @project.issues.find(:all,
318 352 :include => [ :fixed_version, :status, :tracker ],
319 353 :conditions => [ "issue_statuses.is_closed=? and issues.tracker_id in (#{@selected_tracker_ids.join(',')}) and issues.fixed_version_id is not null", true],
320 354 :order => "versions.effective_date DESC, issues.id DESC"
321 355 ) unless @selected_tracker_ids.empty?
322 356 @fixed_issues ||= []
323 357 end
324 358
325 359 private
326 360 # Find project of id params[:id]
327 361 # if not found, redirect to project list
328 362 # Used as a before_filter
329 363 def find_project
330 364 @project = Project.find(params[:id])
331 365 rescue
332 366 redirect_to :action => 'list'
333 367 end
334 368 end
@@ -1,171 +1,171
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 module ApplicationHelper
19 19
20 20 # Return current logged in user or nil
21 21 def loggedin?
22 22 @logged_in_user
23 23 end
24 24
25 25 # Return true if user is logged in and is admin, otherwise false
26 26 def admin_loggedin?
27 27 @logged_in_user and @logged_in_user.admin?
28 28 end
29 29
30 30 # Return true if user is authorized for controller/action, otherwise false
31 31 def authorize_for(controller, action)
32 32 # check if action is allowed on public projects
33 33 if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ controller, action ]
34 34 return true
35 35 end
36 36 # check if user is authorized
37 37 if @logged_in_user and (@logged_in_user.admin? or Permission.allowed_to_role( "%s/%s" % [ controller, action ], @logged_in_user.role_for_project(@project.id) ) )
38 38 return true
39 39 end
40 40 return false
41 41 end
42 42
43 43 # Display a link if user is authorized
44 44 def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
45 45 link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller], options[:action])
46 46 end
47 47
48 48 # Display a link to user's account page
49 49 def link_to_user(user)
50 50 link_to user.display_name, :controller => 'account', :action => 'show', :id => user
51 51 end
52
52
53 53 def format_date(date)
54 54 l_date(date) if date
55 55 end
56 56
57 57 def format_time(time)
58 58 l_datetime(time) if time
59 59 end
60
60
61 61 def pagination_links_full(paginator, options={}, html_options={})
62 62 html = ''
63 63 html << link_to_remote(('&#171; ' + l(:label_previous)),
64 64 {:update => "content", :url => { :page => paginator.current.previous }},
65 65 {:href => url_for(:action => 'list', :params => @params.merge({:page => paginator.current.previous}))}) + ' ' if paginator.current.previous
66 66
67 67 html << (pagination_links_each(paginator, options) do |n|
68 68 link_to_remote(n.to_s,
69 69 {:url => {:action => 'list', :params => @params.merge({:page => n})}, :update => 'content'},
70 70 {:href => url_for(:action => 'list', :params => @params.merge({:page => n}))})
71 71 end || '')
72 72
73 73 html << ' ' + link_to_remote((l(:label_next) + ' &#187;'),
74 74 {:update => "content", :url => { :page => paginator.current.next }},
75 75 {:href => url_for(:action => 'list', :params => @params.merge({:page => paginator.current.next}))}) if paginator.current.next
76 76 html
77 77 end
78 78
79 79 def error_messages_for(object_name, options = {})
80 80 options = options.symbolize_keys
81 81 object = instance_variable_get("@#{object_name}")
82 82 if object && !object.errors.empty?
83 83 # build full_messages here with controller current language
84 84 full_messages = []
85 85 object.errors.each do |attr, msg|
86 86 next if msg.nil?
87 87 if attr == "base"
88 88 full_messages << l(msg)
89 89 else
90 90 full_messages << "&#171; " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " &#187; " + l(msg) unless attr == "custom_values"
91 91 end
92 92 end
93 93 # retrieve custom values error messages
94 94 if object.errors[:custom_values]
95 95 object.custom_values.each do |v|
96 96 v.errors.each do |attr, msg|
97 97 next if msg.nil?
98 98 full_messages << "&#171; " + v.custom_field.name + " &#187; " + l(msg)
99 99 end
100 100 end
101 101 end
102 102 content_tag("div",
103 103 content_tag(
104 104 options[:header_tag] || "h2", lwr(:gui_validation_error, full_messages.length) + " :"
105 105 ) +
106 106 content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }),
107 107 "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
108 108 )
109 109 else
110 110 ""
111 111 end
112 112 end
113 113
114 114 def lang_options_for_select
115 115 (GLoc.valid_languages.sort {|x,y| x.to_s <=> y.to_s }).collect {|lang| [ l_lang_name(lang.to_s, lang), lang.to_s]}
116 116 end
117 117
118 118 def label_tag_for(name, option_tags = nil, options = {})
119 119 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
120 120 content_tag("label", label_text)
121 121 end
122 122
123 123 def labelled_tabular_form_for(name, object, options, &proc)
124 124 options[:html] ||= {}
125 125 options[:html].store :class, "tabular"
126 126 form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
127 127 end
128 128
129 129 def check_all_links(form_name)
130 130 link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
131 131 " | " +
132 132 link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
133 133 end
134 134
135 135 def calendar_for(field_id)
136 136 image_tag("calendar", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
137 137 javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
138 138 end
139 139 end
140 140
141 141 class TabularFormBuilder < ActionView::Helpers::FormBuilder
142 142 include GLoc
143 143
144 144 def initialize(object_name, object, template, options, proc)
145 145 set_language_if_valid options.delete(:lang)
146 146 @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc
147 147 end
148 148
149 149 (field_helpers - %w(radio_button hidden_field) + %w(date_select)).each do |selector|
150 150 src = <<-END_SRC
151 151 def #{selector}(field, options = {})
152 152 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
153 153 label = @template.content_tag("label", label_text,
154 154 :class => (@object.errors[field] ? "error" : nil),
155 155 :for => (@object_name.to_s + "_" + field.to_s))
156 156 label + super
157 157 end
158 158 END_SRC
159 159 class_eval src, __FILE__, __LINE__
160 160 end
161 161
162 162 def select(field, choices, options = {})
163 163 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
164 164 label = @template.content_tag("label", label_text,
165 165 :class => (@object.errors[field] ? "error" : nil),
166 166 :for => (@object_name.to_s + "_" + field.to_s))
167 167 label + super
168 168 end
169 169
170 170 end
171 171
@@ -1,70 +1,72
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 module CustomFieldsHelper
19 19
20 20 # Return custom field html tag corresponding to its format
21 21 def custom_field_tag(custom_value)
22 22 custom_field = custom_value.custom_field
23 23 field_name = "custom_fields[#{custom_field.id}]"
24 24 field_id = "custom_fields_#{custom_field.id}"
25 25
26 26 case custom_field.field_format
27 27 when "string", "int"
28 28 text_field 'custom_value', 'value', :name => field_name, :id => field_id
29 29 when "date"
30 30 text_field('custom_value', 'value', :name => field_name, :id => field_id, :size => 10) +
31 31 calendar_for(field_id)
32 32 when "text"
33 33 text_area 'custom_value', 'value', :name => field_name, :id => field_id, :cols => 60, :rows => 3
34 34 when "bool"
35 35 check_box 'custom_value', 'value', :name => field_name, :id => field_id
36 36 when "list"
37 37 select 'custom_value', 'value', custom_field.possible_values.split('|'), { :include_blank => true }, :name => field_name, :id => field_id
38 38 end
39 39 end
40 40
41 41 # Return custom field label tag
42 42 def custom_field_label_tag(custom_value)
43 43 content_tag "label", custom_value.custom_field.name +
44 44 (custom_value.custom_field.is_required? ? " <span class=\"required\">*</span>" : ""),
45 45 :for => "custom_fields_#{custom_value.custom_field.id}",
46 46 :class => (custom_value.errors.empty? ? nil : "error" )
47 47 end
48 48
49 49 # Return custom field tag with its label tag
50 50 def custom_field_tag_with_label(custom_value)
51 51 custom_field_label_tag(custom_value) + custom_field_tag(custom_value)
52 52 end
53 53
54 54 # Return a string used to display a custom value
55 55 def show_value(custom_value)
56 return "" unless custom_value
57
56 58 case custom_value.custom_field.field_format
57 59 when "date"
58 format_date(custom_value.value.to_date)
60 l_date(custom_value.value.to_date) if custom_value.value
59 61 when "bool"
60 62 l_YesNo(custom_value.value == "1")
61 63 else
62 64 custom_value.value
63 65 end
64 66 end
65 67
66 68 # Return an array of custom field formats which can be used in select_tag
67 69 def custom_field_formats_for_select
68 70 CustomField::FIELD_FORMATS.keys.collect { |k| [ l(CustomField::FIELD_FORMATS[k]), k ] }
69 71 end
70 72 end
@@ -1,101 +1,106
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 module SearchFilterHelper
19 19
20 20 def search_filter_criteria(name, options = {})
21 21 @search_filter ||= {}
22 22 @search_filter[name] ||= {}
23 23 @search_filter[name][:options] = []
24 24 @search_filter[name][:conditions] = {}
25 25 yield.each { |c|
26 26 @search_filter[name][:options] << [c[0], c[1].to_s]
27 27 @search_filter[name][:conditions].store(c[1].to_s, c[2])
28 28 }
29 29 end
30 30
31 31 def search_filter_update
32 32 session[:search_filter] ||= {}
33 33 @search_filter.each_key {|field| session[:search_filter][field] = params[field] }
34 34 end
35 35
36 36 def search_filter_clause
37 37 session[:search_filter] ||= {}
38 38 clause = ["1=1"]
39 39 @search_filter.each { |k, v|
40 40 filter_value = session[:search_filter][k] || v[:options][0][1]
41 41 if v[:conditions][filter_value]
42 42 clause[0] = clause[0] + " AND " + v[:conditions][filter_value].first
43 43 clause += v[:conditions][filter_value][1..-1]
44 44 end
45 45 }
46 46 clause
47 47 end
48 48
49 49 def search_filter_tag(criteria, options = {})
50 50 session[:search_filter] ||= {}
51 51 options[:name] = criteria
52 52 options[:class] += " active-filter" if session[:search_filter][criteria] and session[:search_filter][criteria] != @search_filter[criteria][:options][0][1]
53 53 content_tag("select",
54 54 options_for_select(@search_filter[criteria][:options], session[:search_filter][criteria]),
55 55 options
56 56 )
57 57 end
58 58
59 59 def search_filter_init_list_issues
60 60 search_filter_criteria('status_id') {
61 61 [ [('['+l(:label_open_issues_plural)+']'), "O", ["issue_statuses.is_closed=?", false]],
62 62 [('['+l(:label_closed_issues_plural)+']'), "C", ["issue_statuses.is_closed=?", true]],
63 63 [('['+l(:label_all)+']'), "A", nil]
64 64 ] + IssueStatus.find(:all).collect {|s| [s.name, s.id, ["issues.status_id=?", s.id]] }
65 65 }
66 66
67 67 search_filter_criteria('tracker_id') {
68 68 [ [('['+l(:label_all)+']'), "A", nil]
69 69 ] + Tracker.find(:all).collect {|s| [s.name, s.id, ["issues.tracker_id=?", s.id]] }
70 70 }
71 71
72 72 search_filter_criteria('priority_id') {
73 73 [ [('['+l(:label_all)+']'), "A", nil]
74 74 ] + Enumeration.find(:all, :conditions => ['opt=?','IPRI']).collect {|s| [s.name, s.id, ["issues.priority_id=?", s.id]] }
75 75 }
76 76
77 77 search_filter_criteria('category_id') {
78 78 [ [('['+l(:label_all)+']'), "A", nil],
79 79 [('['+l(:label_none)+']'), "N", ["issues.category_id is null"]]
80 80 ] + @project.issue_categories.find(:all).collect {|s| [s.name, s.id, ["issues.category_id=?", s.id]] }
81 81 }
82 82
83 83 search_filter_criteria('fixed_version_id') {
84 84 [ [('['+l(:label_all)+']'), "A", nil],
85 85 [('['+l(:label_none)+']'), "N", ["issues.fixed_version_id is null"]]
86 86 ] + @project.versions.collect {|s| [s.name, s.id, ["issues.fixed_version_id=?", s.id]] }
87 87 }
88 88
89 search_filter_criteria('author_id') {
90 [ [('['+l(:label_all)+']'), "A", nil],
91 ] + @project.users.collect {|s| [s.display_name, s.id, ["issues.author_id=?", s.id]] }
92 }
93
89 94 search_filter_criteria('assigned_to_id') {
90 95 [ [('['+l(:label_all)+']'), "A", nil],
91 96 [('['+l(:label_none)+']'), "N", ["issues.assigned_to_id is null"]]
92 97 ] + @project.users.collect {|s| [s.display_name, s.id, ["issues.assigned_to_id=?", s.id]] }
93 98 }
94 99
95 100 search_filter_criteria('subproject_id') {
96 101 [ [('['+l(:label_none)+']'), "N", ["issues.project_id=?", @project.id]],
97 102 [('['+l(:label_all)+']'), "A", ["(issues.project_id=? or projects.parent_id=?)", @project.id, @project.id]]
98 103 ]
99 104 }
100 105 end
101 106 end No newline at end of file
@@ -1,42 +1,46
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class Enumeration < ActiveRecord::Base
19 19 before_destroy :check_integrity
20 20
21 21 validates_presence_of :opt, :name
22 22 validates_uniqueness_of :name, :scope => [:opt]
23 23
24 24 OPTIONS = {
25 25 "IPRI" => :enumeration_issue_priorities,
26 26 "DCAT" => :enumeration_doc_categories
27 27 }.freeze
28 28
29 29 def self.get_values(option)
30 30 find(:all, :conditions => ['opt=?', option])
31 31 end
32
33 def option_name
34 OPTIONS[self.opt]
35 end
32 36
33 37 private
34 38 def check_integrity
35 39 case self.opt
36 40 when "IPRI"
37 41 raise "Can't delete enumeration" if Issue.find(:first, :conditions => ["priority_id=?", self.id])
38 42 when "DCAT"
39 43 raise "Can't delete enumeration" if Document.find(:first, :conditions => ["category_id=?", self.id])
40 44 end
41 45 end
42 46 end
@@ -1,64 +1,69
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class Issue < ActiveRecord::Base
19 19
20 20 belongs_to :project
21 21 belongs_to :tracker
22 22 belongs_to :status, :class_name => 'IssueStatus', :foreign_key => 'status_id'
23 23 belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
24 24 belongs_to :assigned_to, :class_name => 'User', :foreign_key => 'assigned_to_id'
25 25 belongs_to :fixed_version, :class_name => 'Version', :foreign_key => 'fixed_version_id'
26 26 belongs_to :priority, :class_name => 'Enumeration', :foreign_key => 'priority_id'
27 27 belongs_to :category, :class_name => 'IssueCategory', :foreign_key => 'category_id'
28 28
29 29 has_many :histories, :class_name => 'IssueHistory', :dependent => true, :order => "issue_histories.created_on DESC", :include => :status
30 30 has_many :attachments, :as => :container, :dependent => true
31 31
32 32 has_many :custom_values, :dependent => true, :as => :customized
33 33 has_many :custom_fields, :through => :custom_values
34 34
35 35 validates_presence_of :subject, :description, :priority, :tracker, :author
36 36 validates_associated :custom_values, :on => :update
37 37
38 38 # set default status for new issues
39 39 def before_validation
40 40 self.status = IssueStatus.default if new_record?
41 41 end
42 42
43 43 def validate
44 44 if self.due_date.nil? && @attributes['due_date'] && !@attributes['due_date'].empty?
45 45 errors.add :due_date, :activerecord_error_not_a_date
46 46 end
47 47 end
48 48
49 49 def before_create
50 50 build_history
51 51 end
52 52
53 53 def long_id
54 54 "%05d" % self.id
55 55 end
56
57 def custom_value_for(custom_field)
58 self.custom_values.each {|v| return v if v.custom_field_id == custom_field.id }
59 return nil
60 end
56 61
57 62 private
58 63 # Creates an history for the issue
59 64 def build_history
60 65 @history = self.histories.build
61 66 @history.status = self.status
62 67 @history.author = self.author
63 68 end
64 69 end
@@ -1,52 +1,57
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class Project < ActiveRecord::Base
19 19 has_many :versions, :dependent => true, :order => "versions.effective_date DESC, versions.name DESC"
20 20 has_many :members, :dependent => true
21 21 has_many :users, :through => :members
22 22 has_many :custom_values, :dependent => true, :as => :customized
23 23 has_many :issues, :dependent => true, :order => "issues.created_on DESC", :include => :status
24 24 has_many :documents, :dependent => true
25 25 has_many :news, :dependent => true, :include => :author
26 26 has_many :issue_categories, :dependent => true, :order => "issue_categories.name"
27 27 has_and_belongs_to_many :custom_fields, :class_name => 'IssueCustomField', :join_table => 'custom_fields_projects', :association_foreign_key => 'custom_field_id'
28 28 acts_as_tree :order => "name", :counter_cache => true
29 29
30 30 validates_presence_of :name, :description
31 31 validates_uniqueness_of :name
32 32 validates_associated :custom_values, :on => :update
33 33
34 34 # returns 5 last created projects
35 35 def self.latest
36 36 find(:all, :limit => 5, :order => "created_on DESC")
37 37 end
38 38
39 39 # Returns an array of all custom fields enabled for project issues
40 40 # (explictly associated custom fields and custom fields enabled for all projects)
41 41 def custom_fields_for_issues(tracker)
42 42 tracker.custom_fields.find(:all, :include => :projects,
43 43 :conditions => ["is_for_all=? or project_id=?", true, self.id])
44 44 #(CustomField.for_all + custom_fields).uniq
45 45 end
46
47 def all_custom_fields
48 @all_custom_fields ||= IssueCustomField.find(:all, :include => :projects,
49 :conditions => ["is_for_all=? or project_id=?", true, self.id])
50 end
46 51
47 52 protected
48 53 def validate
49 54 errors.add(parent_id, " must be a root project") if parent and parent.parent
50 55 errors.add_to_base("A project with subprojects can't be a subproject") if parent and projects_count > 0
51 56 end
52 57 end
@@ -1,47 +1,47
1 1 <h2><%= @document.title %></h2>
2 2
3 3 <strong><%=l(:field_description)%>:</strong> <%= @document.description %><br />
4 4 <strong><%=l(:field_category)%>:</strong> <%= @document.category.name %><br />
5 5 <br />
6 6
7 7 <% if authorize_for('documents', 'edit') %>
8 8 <%= start_form_tag({ :controller => 'documents', :action => 'edit', :id => @document }, :method => 'get' ) %>
9 9 <%= submit_tag l(:button_edit) %>
10 10 <%= end_form_tag %>
11 11 <% end %>
12 12
13 13 <% if authorize_for('documents', 'destroy') %>
14 14 <%= start_form_tag({ :controller => 'documents', :action => 'destroy', :id => @document } ) %>
15 15 <%= submit_tag l(:button_delete) %>
16 16 <%= end_form_tag %>
17 17 <% end %>
18 18
19 19 <br /><br />
20 20
21 <table class="listTableContent">
21 <table class="reportTableContent">
22 22 <% for attachment in @attachments %>
23 23 <tr class="<%= cycle("odd", "even") %>">
24 24 <td><%= format_date(attachment.created_on) %></td>
25 25 <td><%= link_to attachment.filename, :action => 'download', :id => @document, :attachment_id => attachment %></td>
26 26 <td align="center"><%= attachment.author.display_name %></td>
27 27 <td><%= human_size(attachment.filesize) %><br /><%= lwr(:label_download, attachment.downloads) %></td>
28 28
29 29 <% if authorize_for('documents', 'destroy_attachment') %>
30 30 <td align="center">
31 31 <%= start_form_tag :action => 'destroy_attachment', :id => @document, :attachment_id => attachment %>
32 32 <%= submit_tag l(:button_delete), :class => "button-small" %>
33 33 <%= end_form_tag %>
34 34 </tr>
35 35 <% end %>
36 36
37 37 <% end %>
38 38 </table>
39 39 <br />
40 40
41 41 <% if authorize_for('documents', 'add_attachment') %>
42 42 <%= start_form_tag ({ :controller => 'documents', :action => 'add_attachment', :id => @document }, :multipart => true) %>
43 43 <%=l(:label_attachment_new)%><br /><%= file_field 'attachment', 'file' %>
44 44 <%= submit_tag l(:button_add) %>
45 45 <%= end_form_tag %>
46 46 <% end %>
47 47
@@ -1,6 +1,6
1 <h2><%=l(:label_enumeration_new)%></h2>
1 <h2><%= l(@enumeration.option_name) %>: <%=l(:label_enumeration_new)%></h2>
2 2
3 3 <%= start_form_tag({:action => 'create'}, :class => "tabular") %>
4 4 <%= render :partial => 'form' %>
5 5 <%= submit_tag l(:button_create) %>
6 6 <%= end_form_tag %>
@@ -1,111 +1,119
1 1 <h2><%= @issue.tracker.name %> #<%= @issue.id %> - <%= @issue.subject %></h2>
2 <div class="topright">
3 <small>
4 <%= link_to 'PDF', :action => 'export_pdf', :id => @issue %>
5 </small>
6 </div>
2 7
3 8 <div class="box">
4 9 <p>
5 10 <b><%=l(:field_status)%> :</b> <%= @issue.status.name %> &nbsp &nbsp
6 11 <b><%=l(:field_priority)%> :</b> <%= @issue.priority.name %> &nbsp &nbsp
7 12 <b><%=l(:field_assigned_to)%> :</b> <%= @issue.assigned_to ? @issue.assigned_to.display_name : "-" %> &nbsp &nbsp
8 13 <b><%=l(:field_category)%> :</b> <%= @issue.category ? @issue.category.name : "-" %>
9 14 </p>
10 <p><b><%=l(:field_author)%> :</b> <%= @issue.author.display_name %></p>
11 <p><b><%=l(:field_subject)%> :</b> <%= @issue.subject %></p>
12 <p><b><%=l(:field_description)%> :</b> <%= simple_format auto_link @issue.description %></p>
13 <p><b><%=l(:field_due_date)%> :</b> <%= format_date(@issue.due_date) %></p>
14 <p><b><%=l(:field_created_on)%> :</b> <%= format_date(@issue.created_on) %></p>
15 <div class="tabular">
16 <p><label><%=l(:field_author)%> :</label> <%= link_to_user @issue.author %>&nbsp;</p>
17 <p><label><%=l(:field_created_on)%> :</label> <%= format_date(@issue.created_on) %>&nbsp;</p>
18 <p><label><%=l(:field_subject)%> :</label> <%= @issue.subject %>&nbsp;</p>
19 <%= simple_format ("<label>" + l(:field_description) + ": </label>" + auto_link(@issue.description)) %>
20 <p><label><%=l(:field_due_date)%> :</label> <%= format_date(@issue.due_date) %>&nbsp;</p>
15 21
16 22 <% for custom_value in @custom_values %>
17 <p><b><%= custom_value.custom_field.name %></b> : <%= show_value custom_value %></p>
23 <p><label><%= custom_value.custom_field.name %> :</label> <%= show_value custom_value %></p>
18 24 <% end %>
25 &nbsp;
26 </div>
19 27
20 28 <% if authorize_for('issues', 'edit') %>
21 29 <%= start_form_tag ({:controller => 'issues', :action => 'edit', :id => @issue}, :method => "get" ) %>
22 30 <%= submit_tag l(:button_edit) %>
23 31 <%= end_form_tag %>
24 32 &nbsp;&nbsp;
25 33 <% end %>
26 34
27 35 <% if authorize_for('issues', 'change_status') and @status_options and !@status_options.empty? %>
28 36 <%= start_form_tag ({:controller => 'issues', :action => 'change_status', :id => @issue}) %>
29 <label for="history_status_id"><%=l(:label_change_status)%> :</label>
37 <%=l(:label_change_status)%> :
30 38 <select name="history[status_id]">
31 39 <%= options_from_collection_for_select @status_options, "id", "name" %>
32 40 </select>
33 41 <%= submit_tag l(:button_change) %>
34 42 <%= end_form_tag %>
35 43 &nbsp;&nbsp;
36 44 <% end %>
37 45
38 46 <% if authorize_for('projects', 'move_issues') %>
39 47 <%= start_form_tag ({:controller => 'projects', :action => 'move_issues', :id => @project} ) %>
40 48 <%= hidden_field_tag "issue_ids[]", @issue.id %>
41 49 <%= submit_tag l(:button_move) %>
42 50 <%= end_form_tag %>
43 51 &nbsp;&nbsp;
44 52 <% end %>
45 53
46 54 <% if authorize_for('issues', 'destroy') %>
47 55 <%= start_form_tag ({:controller => 'issues', :action => 'destroy', :id => @issue} ) %>
48 56 <%= submit_tag l(:button_delete) %>
49 57 <%= end_form_tag %>
50 58 &nbsp;&nbsp;
51 59 <% end %>
52 60 </div>
53 61
54 62 <% if authorize_for('issues', 'add_note') %>
55 63 <div class="box">
56 64 <h3><%= l(:label_add_note) %></h3>
57 65 <%= start_form_tag ({:controller => 'issues', :action => 'add_note', :id => @issue}, :class => "tabular" ) %>
58 66 <p><label for="history_notes"><%=l(:field_notes)%></label>
59 67 <%= text_area 'history', 'notes', :cols => 60, :rows => 10 %></p>
60 68 <%= submit_tag l(:button_add) %>
61 69 <%= end_form_tag %>
62 70 </div>
63 71 <% end %>
64 72
65 73 <div class="splitcontentleft">
66 74 <div class="box">
67 75 <h3><%=l(:label_history)%></h3>
68 76 <table width="100%">
69 77 <% for history in @issue.histories.find(:all, :include => [:author, :status]) %>
70 78 <tr>
71 79 <td><%= format_date(history.created_on) %></td>
72 80 <td><%= history.author.display_name %></td>
73 81 <td><b><%= history.status.name %></b></td>
74 82 </tr>
75 83 <% if history.notes? %>
76 84 <tr><td colspan=3><%= simple_format auto_link history.notes %></td></tr>
77 85 <% end %>
78 86 <% end %>
79 87 </table>
80 88 </div>
81 89 </div>
82 90
83 91 <div class="splitcontentright">
84 92 <div class="box">
85 93 <h3><%=l(:label_attachment_plural)%></h3>
86 94 <table width="100%">
87 95 <% for attachment in @issue.attachments %>
88 96 <tr>
89 97 <td><%= link_to attachment.filename, :action => 'download', :id => @issue, :attachment_id => attachment %> (<%= human_size(attachment.filesize) %>)</td>
90 98 <td><%= format_date(attachment.created_on) %></td>
91 99 <td><%= attachment.author.display_name %></td>
92 100 <% if authorize_for('issues', 'destroy_attachment') %>
93 101 <td>
94 102 <%= start_form_tag :action => 'destroy_attachment', :id => @issue, :attachment_id => attachment %>
95 103 <%= submit_tag l(:button_delete), :class => "button-small" %>
96 104 <%= end_form_tag %>
97 105 </td>
98 106 <% end %>
99 107 </tr>
100 108 <% end %>
101 109 </table>
102 110 <br />
103 111 <% if authorize_for('issues', 'add_attachment') %>
104 112 <%= start_form_tag ({ :controller => 'issues', :action => 'add_attachment', :id => @issue }, :multipart => true) %>
105 113 <%=l(:label_attachment_new)%>: <%= file_field 'attachment', 'file' %>
106 114 <%= submit_tag l(:button_add) %>
107 115 <%= end_form_tag %>
108 116 <% end %>
109 117 </div>
110 118 </div>
111 119
@@ -1,6 +1,7
1 1 <%=l(:label_issue)%> #<%= issue.id %> - <%= issue.subject %>
2 2 <%=l(:field_author)%>: <%= issue.author.display_name %>
3 <%=l(:field_status)%>: <%= issue.status.name %>
3 4
4 5 <%= issue.description %>
5 6
6 7 http://<%= $RDM_HOST_NAME %>/issues/show/<%= issue.id %> No newline at end of file
@@ -1,60 +1,75
1 1 <h2><%=l(:label_issue_plural)%></h2>
2 <div class="topright">
3 <small>
4 <%= link_to 'PDF ', :action => 'export_issues_pdf', :id => @project %> |
5 <%= link_to 'CSV ', :action => 'export_issues_csv', :id => @project %>
6 </small>
7 </div>
2 8
3 9 <form method="post" class="noborder">
4 10 <table cellpadding=2>
5 11 <tr>
6 12 <td><small><%=l(:field_status)%>:</small><br /><%= search_filter_tag 'status_id', :class => 'select-small' %></td>
7 13 <td><small><%=l(:field_tracker)%>:</small><br /><%= search_filter_tag 'tracker_id', :class => 'select-small' %></td>
8 14 <td><small><%=l(:field_priority)%>:</small><br /><%= search_filter_tag 'priority_id', :class => 'select-small' %></td>
9 15 <td><small><%=l(:field_category)%>:</small><br /><%= search_filter_tag 'category_id', :class => 'select-small' %></td>
10 16 <td><small><%=l(:field_fixed_version)%>:</small><br /><%= search_filter_tag 'fixed_version_id', :class => 'select-small' %></td>
17 <td><small><%=l(:field_author)%>:</small><br /><%= search_filter_tag 'author_id', :class => 'select-small' %></td>
11 18 <td><small><%=l(:field_assigned_to)%>:</small><br /><%= search_filter_tag 'assigned_to_id', :class => 'select-small' %></td>
12 19 <td><small><%=l(:label_subproject_plural)%>:</small><br /><%= search_filter_tag 'subproject_id', :class => 'select-small' %></td>
13 20 <td valign="bottom">
14 21 <%= hidden_field_tag 'set_filter', 1 %>
15 22 <%= submit_tag l(:button_apply), :class => 'button-small' %>
16 23 </td>
17 24 <td valign="bottom">
18 25 <%= link_to l(:button_clear), :action => 'list_issues', :id => @project, :set_filter => 1 %>
19 26 </td>
20 27 </tr>
21 28 </table>
22 29 <%= end_form_tag %>
23 30
24 31 &nbsp;
25
26 <%= start_form_tag ({:controller => 'projects', :action => 'move_issues', :id => @project}, :id => 'issues_form' ) %>
27 32 <table class="listTableContent">
28 33 <tr>
29 34 <td colspan="6" align="left"><small><%= check_all_links 'issues_form' %></small></td>
30 <td colspan="2" align="right"><small><%= link_to l(:label_export_csv), :action => 'export_issues_csv', :id => @project.id %></small></td>
31 </tr>
35 <td colspan="2" align="right">
36 <small><%= l(:label_per_page) %>:</small>
37 <%= start_form_tag %>
38 <%= select_tag 'per_page', options_for_select(@results_per_page_options, @results_per_page), :class => 'select-small'%>
39 <%= submit_tag l(:button_apply), :class => 'button-small'%>
40 <%= end_form_tag %>
41 </td>
42 </tr>
43 </table>
44 <%= start_form_tag ({:controller => 'projects', :action => 'move_issues', :id => @project}, :id => 'issues_form' ) %>
45 <table class="listTableContent">
46
32 47 <tr class="ListHead">
33 48 <td></td>
34 49 <%= sort_header_tag('issues.id', :caption => '#') %>
35 50 <%= sort_header_tag('issue_statuses.name', :caption => l(:field_status)) %>
36 51 <%= sort_header_tag('issues.tracker_id', :caption => l(:field_tracker)) %>
37 52 <th><%=l(:field_subject)%></th>
38 53 <%= sort_header_tag('users.lastname', :caption => l(:field_author)) %>
39 54 <%= sort_header_tag('issues.created_on', :caption => l(:field_created_on)) %>
40 55 <%= sort_header_tag('issues.updated_on', :caption => l(:field_updated_on)) %>
41 56 </tr>
42 57 <% for issue in @issues %>
43 58 <tr bgcolor="#<%= issue.status.html_color %>">
44 59 <td width="15"><%= check_box_tag "issue_ids[]", issue.id %></td>
45 60 <td align="center"><%= link_to issue.long_id, :controller => 'issues', :action => 'show', :id => issue %></td>
46 61 <td align="center"><%= issue.status.name %></td>
47 62 <td align="center"><%= issue.tracker.name %></td>
48 63 <td><%= link_to issue.subject, :controller => 'issues', :action => 'show', :id => issue %></td>
49 64 <td align="center"><%= issue.author.display_name %></td>
50 65 <td align="center"><%= format_time(issue.created_on) %></td>
51 66 <td align="center"><%= format_time(issue.updated_on) %></td>
52 67 </tr>
53 68 <% end %>
54 69 </table>
55 70 <p>
56 71 <%= pagination_links_full @issue_pages %>
57 72 [ <%= @issue_pages.current.first_item %> - <%= @issue_pages.current.last_item %> / <%= @issue_count %> ]
58 73 </p>
59 74 <%= submit_tag l(:button_move) %>
60 75 <%= end_form_tag %> No newline at end of file
@@ -1,22 +1,20
1 1 <h2><%=l(:label_report_plural)%></h2>
2 2
3 3 <div class="splitcontentleft">
4 <strong><%=l(:field_tracker)%></strong>
4 <strong><%=l(:field_tracker)%></strong> <small>[ <%= link_to l(:label_details), :detail => 'author' %> ]</small>
5 5 <%= render :partial => 'simple', :locals => { :data => @issues_by_tracker, :field_name => "tracker_id", :rows => @trackers } %>
6 <p align="right"><small><%= link_to l(:label_details), :detail => 'tracker' %></small>&nbsp;</p>
7
8 <strong><%=l(:field_priority)%></strong>
6 <br />
7 <strong><%=l(:field_priority)%></strong> <small>[ <%= link_to l(:label_details), :detail => 'priority' %> ]</small>
9 8 <%= render :partial => 'simple', :locals => { :data => @issues_by_priority, :field_name => "priority_id", :rows => @priorities } %>
10 <p align="right"><small><%= link_to l(:label_details), :detail => 'priority' %></small>&nbsp;</p>
11
12 <strong><%=l(:field_author)%></strong>
9 <br />
10 <strong><%=l(:field_author)%></strong> <small>[ <%= link_to l(:label_details), :detail => 'author' %> ]</small>
13 11 <%= render :partial => 'simple', :locals => { :data => @issues_by_author, :field_name => "author_id", :rows => @authors } %>
14 <p align="right"><small><%= link_to l(:label_details), :detail => 'author' %></small>&nbsp;</p>
12 <br />
15 13 </div>
16 14
17 15 <div class="splitcontentright">
18 <strong><%=l(:field_category)%></strong>
16 <strong><%=l(:field_category)%></strong> <small>[ <%= link_to l(:label_details), :detail => 'category' %> ]</small>
19 17 <%= render :partial => 'simple', :locals => { :data => @issues_by_category, :field_name => "category_id", :rows => @categories } %>
20 <p align="right"><small><%= link_to l(:label_details), :detail => 'category' %></small>&nbsp;</p>
18 <br />
21 19 </div>
22 20
@@ -1,296 +1,299
1 1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December
5 5 actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 day
9 9 actionview_datehelper_time_in_words_day_plural: %d days
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: half a minute
15 15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 20 actionview_instancetag_blank_option: Bitte auserwählt
21 21
22 22 activerecord_error_inclusion: ist nicht in der Liste eingeschlossen
23 23 activerecord_error_exclusion: ist reserviert
24 24 activerecord_error_invalid: ist unzulässig
25 25 activerecord_error_confirmation: bringt nicht Bestätigung zusammen
26 26 activerecord_error_accepted: muß angenommen werden
27 27 activerecord_error_empty: kann nicht leer sein
28 28 activerecord_error_blank: kann nicht leer sein
29 29 activerecord_error_too_long: ist zu lang
30 30 activerecord_error_too_short: ist zu kurz
31 31 activerecord_error_wrong_length: ist die falsche Länge
32 32 activerecord_error_taken: ist bereits genommen worden
33 33 activerecord_error_not_a_number: ist nicht eine Zahl
34 34 #activerecord_error_not_a_date: is not a valid date
35 35
36 36 general_fmt_age: %d yr
37 37 general_fmt_age_plural: %d yrs
38 38 general_fmt_date: %%b %%d, %%Y (%%a)
39 39 general_fmt_datetime: %%b %%d, %%Y (%%a), %%I:%%M %%p
40 40 general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
41 41 general_fmt_time: %%I:%%M %%p
42 42 general_text_No: 'Nein'
43 43 general_text_Yes: 'Ja'
44 44 general_text_no: 'nein'
45 45 general_text_yes: 'ja'
46 46 general_lang_de: 'Deutsch'
47 general_csv_separator: ';'
47 48
48 49 notice_account_updated: Konto wurde erfolgreich aktualisiert.
49 50 notice_account_invalid_creditentials: Unzulässiger Benutzer oder Passwort
50 51 notice_account_password_updated: Passwort wurde erfolgreich aktualisiert.
51 52 notice_account_wrong_password: Falsches Passwort
52 53 notice_account_register_done: Konto wurde erfolgreich verursacht.
53 54 notice_account_unknown_email: Unbekannter Benutzer.
54 55 notice_can_t_change_password: Dieses Konto verwendet eine externe Authentisierung Quelle. Unmöglich, das Kennwort zu ändern.
55 56 notice_account_lost_email_sent: Ein email mit Anweisungen, ein neues Kennwort zu wählen ist dir geschickt worden.
56 57 notice_account_activated: Dein Konto ist aktiviert worden. Du kannst jetzt einloggen.
57 58 notice_successful_create: Erfolgreiche Kreation.
58 59 notice_successful_update: Erfolgreiches Update.
59 60 notice_successful_delete: Erfolgreiche Auslassung.
60 61 notice_successful_connection: Erfolgreicher Anschluß.
61 62 notice_file_not_found: Erbetene Akte besteht nicht oder ist gelöscht worden.
62 63 notice_locking_conflict: Data have been updated by another user.
63 64
64 65 gui_validation_error: 1 Störung
65 66 gui_validation_error_plural: %d Störungen
66 67
67 68 field_name: Name
68 69 field_description: Beschreibung
69 70 field_summary: Zusammenfassung
70 71 field_is_required: Erforderlich
71 72 field_firstname: Vorname
72 73 field_lastname: Nachname
73 74 field_mail: Email
74 75 field_filename: Datei
75 76 field_filesize: Grootte
76 77 field_downloads: Downloads
77 78 field_author: Autor
78 79 field_created_on: Angelegt
79 80 field_updated_on: aktualisiert
80 81 field_field_format: Format
81 82 field_is_for_all: Für alle Projekte
82 83 field_possible_values: Mögliche Werte
83 84 field_regexp: Regulärer Ausdruck
84 85 field_min_length: Minimale Länge
85 86 field_max_length: Maximale Länge
86 87 field_value: Wert
87 88 field_category: Kategorie
88 89 field_title: Títel
89 90 field_project: Projekt
90 91 #field_issue: Issue
91 92 field_status: Status
92 93 field_notes: Anmerkungen
93 94 field_is_closed: Problem erledigt
94 95 #field_is_default: Default status
95 96 field_html_color: Farbe
96 97 field_tracker: Tracker
97 98 field_subject: Thema
98 99 #field_due_date: Due date
99 100 field_assigned_to: Zugewiesen an
100 101 field_priority: Priorität
101 102 field_fixed_version: Erledigt in Version
102 103 field_user: Benutzer
103 104 field_role: Rolle
104 105 field_homepage: Startseite
105 106 field_is_public: Öffentlich
106 107 #field_parent: Subprojekt von
107 108 field_is_in_chlog: Ansicht der Issues in der Historie
108 109 field_login: Mitgliedsname
109 110 field_mail_notification: Mailbenachrichtigung
110 111 #field_admin: Administrator
111 112 field_locked: Gesperrt
112 113 field_last_login_on: Letzte Anmeldung
113 114 field_language: Sprache
114 115 field_effective_date: Datum
115 116 field_password: Passwort
116 117 field_new_password: Neues Passwort
117 118 field_password_confirmation: Bestätigung
118 119 field_version: Version
119 120 field_type: Typ
120 121 field_host: Host
121 122 #field_port: Port
122 123 #field_account: Account
123 124 #field_base_dn: Base DN
124 125 #field_attr_login: Login attribute
125 126 #field_attr_firstname: Firstname attribute
126 127 #field_attr_lastname: Lastname attribute
127 128 #field_attr_mail: Email attribute
128 129 #field_onthefly: On-the-fly user creation
129 130
130 131 label_user: Benutzer
131 132 label_user_plural: Benutzer
132 133 label_user_new: Neuer Benutzer
133 134 label_project: Projekt
134 135 label_project_new: Neues Projekt
135 136 label_project_plural: Projekte
136 137 #label_project_latest: Latest projects
137 138 #label_issue: Issue
138 139 #label_issue_new: New issue
139 140 #label_issue_plural: Issues
140 141 #label_issue_view_all: View all issues
141 142 label_document: Dokument
142 143 label_document_new: Neues Dokument
143 144 label_document_plural: Dokumente
144 145 label_role: Rolle
145 146 label_role_plural: Rollen
146 147 label_role_new: Neue Rolle
147 148 label_role_and_permissions: Rollen und Rechte
148 149 label_member: Mitglied
149 150 label_member_new: Neues Mitglied
150 151 label_member_plural: Mitglieder
151 152 label_tracker: Tracker
152 153 label_tracker_plural: Tracker
153 154 label_tracker_new: Neuer Tracker
154 155 label_workflow: Workflow
155 156 label_issue_status: Problem Status
156 157 label_issue_status_plural: Problem Stati
157 158 label_issue_status_new: Neuer Status
158 159 label_issue_category: Problem Kategorie
159 160 label_issue_category_plural: Problem Kategorien
160 161 label_issue_category_new: Neue Kategorie
161 162 label_custom_field: Benutzerdefiniertes Feld
162 163 label_custom_field_plural: Benutzerdefinierte Felder
163 164 label_custom_field_new: Neues Feld
164 165 label_enumerations: Enumerationen
165 166 label_enumeration_new: Neuer Wert
166 167 label_information: Information
167 168 label_information_plural: Informationen
168 169 #label_please_login: Please login
169 170 label_register: Anmelden
170 171 label_password_lost: Passwort vergessen
171 172 label_home: Hauptseite
172 173 label_my_page: Meine Seite
173 174 label_my_account: Mein Konto
174 175 label_my_projects: Meine Projekte
175 176 label_administration: Administration
176 177 label_login: Einloggen
177 178 label_logout: Abmelden
178 179 label_help: Hilfe
179 180 label_reported_issues: Gemeldete Issues
180 181 label_assigned_to_me_issues: Mir zugewiesen
181 182 label_last_login: Letzte Anmeldung
182 183 #label_last_updates: Last updated
183 184 #label_last_updates_plural: %d last updated
184 185 label_registered_on: Angemeldet am
185 186 label_activity: Aktivität
186 187 label_new: Neue
187 188 label_logged_as: Angemeldet als
188 189 #label_environment: Environment
189 190 label_authentication: Authentisierung
190 191 #label_auth_source: Authentification mode
191 192 #label_auth_source_new: New authentication mode
192 193 #label_auth_source_plural: Authentification modes
193 194 #label_subproject: Subproject
194 195 #label_subproject_plural: Subprojects
195 196 label_min_max_length: Min - Max Länge
196 197 label_list: Liste
197 198 label_date: Date
198 199 label_integer: Zahl
199 200 label_boolean: Boolesch
200 201 #label_string: String
201 202 label_text: Text
202 203 label_attribute: Attribut
203 204 label_attribute_plural: Attribute
204 205 #label_download: %d Download
205 206 #label_download_plural: %d Downloads
206 207 label_no_data: Nichts anzuzeigen
207 208 label_change_status: Statuswechsel
208 209 label_history: Historie
209 210 label_attachment: Datei
210 211 label_attachment_new: Neue Datei
211 212 #label_attachment_delete: Delete file
212 213 label_attachment_plural: Dateien
213 214 label_report: Bericht
214 215 label_report_plural: Berichte
215 216 #label_news: Neuigkeiten
216 217 #label_news_new: Add news
217 218 #label_news_plural: Neuigkeiten
218 219 label_news_latest: Letzte Neuigkeiten
219 220 label_news_view_all: Alle Neuigkeiten anzeigen
220 221 label_change_log: Change log
221 222 label_settings: Konfiguration
222 223 label_overview: Übersicht
223 224 label_version: Version
224 225 label_version_new: Neue Version
225 226 label_version_plural: Versionen
226 227 label_confirmation: Bestätigung
227 228 #label_export_csv: Export to CSV
229 #label_export_pdf: Export to PDF
228 230 label_read: Lesen...
229 231 label_public_projects: Öffentliche Projekte
230 232 #label_open_issues: Open
231 233 #label_open_issues_plural: Open
232 234 #label_closed_issues: Closed
233 235 #label_closed_issues_plural: Closed
234 236 label_total: Gesamtzahl
235 237 label_permissions: Berechtigungen
236 238 label_current_status: Gegenwärtiger Status
237 239 label_new_statuses_allowed: Neue Status gewährten
238 240 label_all: Alle
239 241 label_none: Kein
240 242 label_next: Weiter
241 243 label_previous: Zurück
242 244 label_used_by: Benutzt von
243 245 #label_details: Details...
244 246 #label_add_note: Add a note
247 #label_per_page: Per page
245 248
246 249 button_login: Einloggen
247 250 button_submit: Einreichen
248 251 button_save: Speichern
249 252 button_check_all: Alles auswählen
250 253 button_uncheck_all: Alles abwählen
251 254 button_delete: Löschen
252 255 button_create: Anlegen
253 256 button_test: Testen
254 257 button_edit: Bearbeiten
255 258 button_add: Hinzufügen
256 259 button_change: Wechseln
257 260 button_apply: Anwenden
258 261 button_clear: Zurücksetzen
259 262 button_lock: Verriegeln
260 263 button_unlock: Entriegeln
261 264 button_download: Fernzuladen
262 265 button_list: Aufzulisten
263 266 button_view: Siehe
264 267 button_move: Bewegen
265 268 #button_back: Back
266 269
267 270 text_select_mail_notifications: Aktionen für die Mailbenachrichtigung aktiviert werden soll.
268 271 text_regexp_info: eg. ^[A-Z0-9]+$
269 272 text_min_max_length_info: 0 heisst keine Beschränkung
270 273 #text_possible_values_info: values separated with |
271 274 text_project_destroy_confirmation: Sind sie sicher, daß sie das Projekt löschen wollen ?
272 275 text_workflow_edit: Auswahl Workflow zum Bearbeiten
273 276 text_are_you_sure: Sind sie sicher ?
274 277
275 278 default_role_manager: Manager
276 279 default_role_developper: Developer
277 280 default_role_reporter: Reporter
278 281 default_tracker_bug: Fehler
279 282 default_tracker_feature: Feature
280 283 default_tracker_support: Support
281 284 default_issue_status_new: Neu
282 285 default_issue_status_assigned: Zugewiesen
283 286 default_issue_status_resolved: Gelöst
284 287 default_issue_status_feedback: Feedback
285 288 default_issue_status_closed: Erledigt
286 289 default_issue_status_rejected: Abgewiesen
287 290 default_doc_category_user: Benutzerdokumentation
288 291 default_doc_category_tech: Technische Dokumentation
289 292 default_priority_low: Niedrig
290 293 default_priority_normal: Normal
291 294 default_priority_high: Hoch
292 295 default_priority_urgent: Dringend
293 296 default_priority_immediate: Sofort
294 297
295 298 enumeration_issue_priorities: Issue-Prioritäten
296 299 enumeration_doc_categories: Dokumentenkategorien
@@ -1,296 +1,299
1 1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December
5 5 actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 day
9 9 actionview_datehelper_time_in_words_day_plural: %d days
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: half a minute
15 15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 20 actionview_instancetag_blank_option: Please select
21 21
22 22 activerecord_error_inclusion: is not included in the list
23 23 activerecord_error_exclusion: is reserved
24 24 activerecord_error_invalid: is invalid
25 25 activerecord_error_confirmation: doesn't match confirmation
26 26 activerecord_error_accepted: must be accepted
27 27 activerecord_error_empty: can't be empty
28 28 activerecord_error_blank: can't be blank
29 29 activerecord_error_too_long: is too long
30 30 activerecord_error_too_short: is too short
31 31 activerecord_error_wrong_length: is the wrong length
32 32 activerecord_error_taken: has already been taken
33 33 activerecord_error_not_a_number: is not a number
34 34 activerecord_error_not_a_date: is not a valid date
35 35
36 36 general_fmt_age: %d yr
37 37 general_fmt_age_plural: %d yrs
38 38 general_fmt_date: %%m/%%d/%%Y
39 39 general_fmt_datetime: %%m/%%d/%%Y %%I:%%M %%p
40 40 general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
41 41 general_fmt_time: %%I:%%M %%p
42 42 general_text_No: 'No'
43 43 general_text_Yes: 'Yes'
44 44 general_text_no: 'no'
45 45 general_text_yes: 'yes'
46 46 general_lang_en: 'English'
47 general_csv_separator: ','
47 48
48 49 notice_account_updated: Account was successfully updated.
49 50 notice_account_invalid_creditentials: Invalid user or password
50 51 notice_account_password_updated: Password was successfully updated.
51 52 notice_account_wrong_password: Wrong password
52 53 notice_account_register_done: Account was successfully created.
53 54 notice_account_unknown_email: Unknown user.
54 55 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
55 56 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
56 57 notice_account_activated: Your account has been activated. You can now log in.
57 58 notice_successful_create: Successful creation.
58 59 notice_successful_update: Successful update.
59 60 notice_successful_delete: Successful deletion.
60 61 notice_successful_connection: Successful connection.
61 62 notice_file_not_found: Requested file doesn't exist or has been deleted.
62 63 notice_locking_conflict: Data have been updated by another user.
63 64
64 65 gui_validation_error: 1 error
65 66 gui_validation_error_plural: %d errors
66 67
67 68 field_name: Name
68 69 field_description: Description
69 70 field_summary: Summary
70 71 field_is_required: Required
71 72 field_firstname: Firstname
72 73 field_lastname: Lastname
73 74 field_mail: Email
74 75 field_filename: File
75 76 field_filesize: Size
76 77 field_downloads: Downloads
77 78 field_author: Author
78 79 field_created_on: Created
79 80 field_updated_on: Updated
80 81 field_field_format: Format
81 82 field_is_for_all: For all projects
82 83 field_possible_values: Possible values
83 84 field_regexp: Regular expression
84 85 field_min_length: Minimum length
85 86 field_max_length: Maximum length
86 87 field_value: Value
87 88 field_category: Category
88 89 field_title: Title
89 90 field_project: Project
90 91 field_issue: Issue
91 92 field_status: Status
92 93 field_notes: Notes
93 94 field_is_closed: Issue closed
94 95 field_is_default: Default status
95 96 field_html_color: Color
96 97 field_tracker: Tracker
97 98 field_subject: Subject
98 99 field_due_date: Due date
99 100 field_assigned_to: Assigned to
100 101 field_priority: Priority
101 102 field_fixed_version: Fixed version
102 103 field_user: User
103 104 field_role: Role
104 105 field_homepage: Homepage
105 106 field_is_public: Public
106 107 field_parent: Subproject of
107 108 field_is_in_chlog: Issues displayed in changelog
108 109 field_login: Login
109 110 field_mail_notification: Mail notifications
110 111 field_admin: Administrator
111 112 field_locked: Locked
112 113 field_last_login_on: Last connection
113 114 field_language: Language
114 115 field_effective_date: Date
115 116 field_password: Password
116 117 field_new_password: New password
117 118 field_password_confirmation: Confirmation
118 119 field_version: Version
119 120 field_type: Type
120 121 field_host: Host
121 122 field_port: Port
122 123 field_account: Account
123 124 field_base_dn: Base DN
124 125 field_attr_login: Login attribute
125 126 field_attr_firstname: Firstname attribute
126 127 field_attr_lastname: Lastname attribute
127 128 field_attr_mail: Email attribute
128 129 field_onthefly: On-the-fly user creation
129 130
130 131 label_user: User
131 132 label_user_plural: Users
132 133 label_user_new: New user
133 134 label_project: Project
134 135 label_project_new: New project
135 136 label_project_plural: Projects
136 137 label_project_latest: Latest projects
137 138 label_issue: Issue
138 139 label_issue_new: New issue
139 140 label_issue_plural: Issues
140 141 label_issue_view_all: View all issues
141 142 label_document: Document
142 143 label_document_new: New document
143 144 label_document_plural: Documents
144 145 label_role: Role
145 146 label_role_plural: Roles
146 147 label_role_new: New role
147 148 label_role_and_permissions: Roles and permissions
148 149 label_member: Member
149 150 label_member_new: New member
150 151 label_member_plural: Members
151 152 label_tracker: Tracker
152 153 label_tracker_plural: Trackers
153 154 label_tracker_new: New tracker
154 155 label_workflow: Workflow
155 156 label_issue_status: Issue status
156 157 label_issue_status_plural: Issue statuses
157 158 label_issue_status_new: New status
158 159 label_issue_category: Issue category
159 160 label_issue_category_plural: Issue categories
160 161 label_issue_category_new: New category
161 162 label_custom_field: Custom field
162 163 label_custom_field_plural: Custom fields
163 164 label_custom_field_new: New custom field
164 165 label_enumerations: Enumerations
165 166 label_enumeration_new: New value
166 167 label_information: Information
167 168 label_information_plural: Information
168 169 label_please_login: Please login
169 170 label_register: Register
170 171 label_password_lost: Lost password
171 172 label_home: Home
172 173 label_my_page: My page
173 174 label_my_account: My account
174 175 label_my_projects: My projects
175 176 label_administration: Administration
176 177 label_login: Login
177 178 label_logout: Logout
178 179 label_help: Help
179 180 label_reported_issues: Reported issues
180 181 label_assigned_to_me_issues: Issues assigned to me
181 182 label_last_login: Last connection
182 183 label_last_updates: Last updated
183 184 label_last_updates_plural: %d last updated
184 185 label_registered_on: Registered on
185 186 label_activity: Activity
186 187 label_new: New
187 188 label_logged_as: Logged as
188 189 label_environment: Environment
189 190 label_authentication: Authentication
190 191 label_auth_source: Authentification mode
191 192 label_auth_source_new: New authentication mode
192 193 label_auth_source_plural: Authentification modes
193 194 label_subproject: Subproject
194 195 label_subproject_plural: Subprojects
195 196 label_min_max_length: Min - Max length
196 197 label_list: List
197 198 label_date: Date
198 199 label_integer: Integer
199 200 label_boolean: Boolean
200 201 label_string: String
201 202 label_text: Text
202 203 label_attribute: Attribute
203 204 label_attribute_plural: Attributes
204 205 label_download: %d Download
205 206 label_download_plural: %d Downloads
206 207 label_no_data: No data to display
207 208 label_change_status: Change status
208 209 label_history: History
209 210 label_attachment: File
210 211 label_attachment_new: New file
211 212 label_attachment_delete: Delete file
212 213 label_attachment_plural: Files
213 214 label_report: Report
214 215 label_report_plural: Reports
215 216 label_news: News
216 217 label_news_new: Add news
217 218 label_news_plural: News
218 219 label_news_latest: Latest news
219 220 label_news_view_all: View all news
220 221 label_change_log: Change log
221 222 label_settings: Settings
222 223 label_overview: Overview
223 224 label_version: Version
224 225 label_version_new: New version
225 226 label_version_plural: Versions
226 227 label_confirmation: Confirmation
227 228 label_export_csv: Export to CSV
229 label_export_pdf: Export to PDF
228 230 label_read: Read...
229 231 label_public_projects: Public projects
230 232 label_open_issues: Open
231 233 label_open_issues_plural: Open
232 234 label_closed_issues: Closed
233 235 label_closed_issues_plural: Closed
234 236 label_total: Total
235 237 label_permissions: Permissions
236 238 label_current_status: Current status
237 239 label_new_statuses_allowed: New statuses allowed
238 240 label_all: All
239 241 label_none: None
240 242 label_next: Next
241 243 label_previous: Previous
242 244 label_used_by: Used by
243 245 label_details: Details...
244 246 label_add_note: Add a note
247 label_per_page: Per page
245 248
246 249 button_login: Login
247 250 button_submit: Submit
248 251 button_save: Save
249 252 button_check_all: Check all
250 253 button_uncheck_all: Uncheck all
251 254 button_delete: Delete
252 255 button_create: Create
253 256 button_test: Test
254 257 button_edit: Edit
255 258 button_add: Add
256 259 button_change: Change
257 260 button_apply: Apply
258 261 button_clear: Clear
259 262 button_lock: Lock
260 263 button_unlock: Unlock
261 264 button_download: Download
262 265 button_list: List
263 266 button_view: View
264 267 button_move: Move
265 268 button_back: Back
266 269
267 270 text_select_mail_notifications: Select actions for which mail notifications should be sent.
268 271 text_regexp_info: eg. ^[A-Z0-9]+$
269 272 text_min_max_length_info: 0 means no restriction
270 273 text_possible_values_info: values separated with |
271 274 text_project_destroy_confirmation: Are you sure you want to delete this project and all related data ?
272 275 text_workflow_edit: Select a role and a tracker to edit the workflow
273 276 text_are_you_sure: Are you sure ?
274 277
275 278 default_role_manager: Manager
276 279 default_role_developper: Developer
277 280 default_role_reporter: Reporter
278 281 default_tracker_bug: Bug
279 282 default_tracker_feature: Feature
280 283 default_tracker_support: Support
281 284 default_issue_status_new: New
282 285 default_issue_status_assigned: Assigned
283 286 default_issue_status_resolved: Resolved
284 287 default_issue_status_feedback: Feedback
285 288 default_issue_status_closed: Closed
286 289 default_issue_status_rejected: Rejected
287 290 default_doc_category_user: User documentation
288 291 default_doc_category_tech: Technical documentation
289 292 default_priority_low: Low
290 293 default_priority_normal: Normal
291 294 default_priority_high: High
292 295 default_priority_urgent: Urgent
293 296 default_priority_immediate: Immediate
294 297
295 298 enumeration_issue_priorities: Issue priorities
296 299 enumeration_doc_categories: Document categories
@@ -1,296 +1,299
1 1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre
5 5 actionview_datehelper_select_month_names_abbr: Ene,Feb,Mar,Abr,Mayo,Jun,Jul,Ago,Sep,Oct,Nov,Dic
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 day
9 9 actionview_datehelper_time_in_words_day_plural: %d days
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: half a minute
15 15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 20 actionview_instancetag_blank_option: Please select
21 21
22 22 activerecord_error_inclusion: is not included in the list
23 23 activerecord_error_exclusion: is reserved
24 24 activerecord_error_invalid: is invalid
25 25 activerecord_error_confirmation: doesn't match confirmation
26 26 activerecord_error_accepted: must be accepted
27 27 activerecord_error_empty: can't be empty
28 28 activerecord_error_blank: can't be blank
29 29 activerecord_error_too_long: is too long
30 30 activerecord_error_too_short: is too short
31 31 activerecord_error_wrong_length: is the wrong length
32 32 activerecord_error_taken: has already been taken
33 33 activerecord_error_not_a_number: is not a number
34 34 #activerecord_error_not_a_date: is not a valid date
35 35
36 36 general_fmt_age: %d año
37 37 general_fmt_age_plural: %d años
38 38 general_fmt_date: %%d/%%m/%%Y
39 39 general_fmt_datetime: %%d/%%m/%%Y %%H:%%M
40 40 general_fmt_datetime_short: %%d/%%m %%H:%%M
41 41 general_fmt_time: %%H:%%M
42 42 general_text_No: 'No'
43 43 general_text_Yes: 'Sí'
44 44 general_text_no: 'no'
45 45 general_text_yes: 'sí'
46 46 general_lang_es: 'Español'
47 general_csv_separator: ';'
47 48
48 49 notice_account_updated: Account was successfully updated.
49 50 notice_account_invalid_creditentials: Invalid user or password
50 51 notice_account_password_updated: Password was successfully updated.
51 52 notice_account_wrong_password: Wrong password
52 53 notice_account_register_done: Account was successfully created.
53 54 notice_account_unknown_email: Unknown user.
54 55 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
55 56 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
56 57 notice_account_activated: Your account has been activated. You can now log in.
57 58 notice_successful_create: Successful creation.
58 59 notice_successful_update: Successful update.
59 60 notice_successful_delete: Successful deletion.
60 61 notice_successful_connection: Successful connection.
61 62 notice_file_not_found: Requested file doesn't exist or has been deleted.
62 63 notice_locking_conflict: Data have been updated by another user.
63 64
64 65 gui_validation_error: 1 error
65 66 gui_validation_error_plural: %d errores
66 67
67 68 field_name: Nombre
68 69 field_description: Descripción
69 70 field_summary: Resumen
70 71 field_is_required: Obligatorio
71 72 field_firstname: Nombre
72 73 field_lastname: Apellido
73 74 field_mail: Email
74 75 field_filename: Fichero
75 76 field_filesize: Tamaño
76 77 field_downloads: Telecargas
77 78 field_author: Autor
78 79 field_created_on: Creado
79 80 field_updated_on: Actualizado
80 81 field_field_format: Formato
81 82 field_is_for_all: Para todos los proyectos
82 83 field_possible_values: Valores posibles
83 84 field_regexp: Expresión regular
84 85 #field_min_length: Minimum length
85 86 #field_max_length: Maximum length
86 87 field_value: Valor
87 88 field_category: Categoría
88 89 field_title: Título
89 90 field_project: Proyecto
90 91 field_issue: Petición
91 92 field_status: Estatuto
92 93 field_notes: Notas
93 94 field_is_closed: Petición resuelta
94 95 field_is_default: Estatuto por defecto
95 96 field_html_color: Color
96 97 field_tracker: Tracker
97 98 field_subject: Tema
98 99 #field_due_date: Due date
99 100 field_assigned_to: Asignado a
100 101 field_priority: Prioridad
101 102 field_fixed_version: Versión corregida
102 103 field_user: Usuario
103 104 field_role: Papel
104 105 field_homepage: Sitio web
105 106 field_is_public: Público
106 107 #field_parent: Subproject de
107 108 field_is_in_chlog: Consultar las peticiones en el histórico
108 109 field_login: Identificador
109 110 field_mail_notification: Notificación por mail
110 111 field_admin: Administrador
111 112 field_locked: Cerrado
112 113 field_last_login_on: Última conexión
113 114 field_language: Lengua
114 115 field_effective_date: Fecha
115 116 field_password: Contraseña
116 117 field_new_password: Nueva contraseña
117 118 field_password_confirmation: Confirmación
118 119 field_version: Versión
119 120 field_type: Tipo
120 121 #field_host: Host
121 122 #field_port: Port
122 123 #field_account: Account
123 124 #field_base_dn: Base DN
124 125 #field_attr_login: Login attribute
125 126 #field_attr_firstname: Firstname attribute
126 127 #field_attr_lastname: Lastname attribute
127 128 #field_attr_mail: Email attribute
128 129 #field_onthefly: On-the-fly user creation
129 130
130 131 label_user: Usuario
131 132 label_user_plural: Usuarios
132 133 label_user_new: Nuevo usuario
133 134 label_project: Proyecto
134 135 label_project_new: Nuevo proyecto
135 136 label_project_plural: Proyectos
136 137 #label_project_latest: Latest projects
137 138 label_issue: Petición
138 139 label_issue_new: Nueva petición
139 140 label_issue_plural: Peticiones
140 141 label_issue_view_all: Ver todas las peticiones
141 142 label_document: Documento
142 143 label_document_new: Nuevo documento
143 144 label_document_plural: Documentos
144 145 label_role: Papel
145 146 label_role_plural: Papeles
146 147 label_role_new: Nuevo papel
147 148 label_role_and_permissions: Papeles y permisos
148 149 label_member: Miembro
149 150 label_member_new: Nuevo miembro
150 151 label_member_plural: Miembros
151 152 label_tracker: Tracker
152 153 label_tracker_plural: Trackers
153 154 label_tracker_new: Nuevo tracker
154 155 label_workflow: Workflow
155 156 label_issue_status: Estatuto de petición
156 157 label_issue_status_plural: Estatutos de las peticiones
157 158 label_issue_status_new: Nuevo estatuto
158 159 label_issue_category: Categoría de las peticiones
159 160 label_issue_category_plural: Categorías de las peticiones
160 161 label_issue_category_new: Nueva categoría
161 162 label_custom_field: Campo personalizado
162 163 label_custom_field_plural: Campos personalizados
163 164 label_custom_field_new: Nuevo campo personalizado
164 165 label_enumerations: Listas de valores
165 166 label_enumeration_new: Nuevo valor
166 167 label_information: Informacion
167 168 label_information_plural: Informaciones
168 169 label_please_login: Conexión
169 170 #label_register: Register
170 171 label_password_lost: ¿Olvidaste la contraseña?
171 172 label_home: Acogida
172 173 label_my_page: Mi página
173 174 label_my_account: Mi cuenta
174 175 label_my_projects: Mis proyectos
175 176 label_administration: Administración
176 177 label_login: Conexión
177 178 label_logout: Desconexión
178 179 label_help: Ayuda
179 180 label_reported_issues: Peticiones registradas
180 181 label_assigned_to_me_issues: Peticiones que me están asignadas
181 182 label_last_login: Última conexión
182 183 label_last_updates: Actualizado
183 184 label_last_updates_plural: %d Actualizados
184 185 label_registered_on: Inscrito el
185 186 label_activity: Actividad
186 187 label_new: Nuevo
187 188 label_logged_as: Conectado como
188 189 #label_environment: Environment
189 190 #label_authentication: Authentication
190 191 #label_auth_source: Authentification mode
191 192 #label_auth_source_new: New authentication mode
192 193 #label_auth_source_plural: Authentification modes
193 194 #label_subproject: Subproject
194 195 #label_subproject_plural: Subprojects
195 196 #label_min_max_length: Min - Max length
196 197 #label_list: List
197 198 label_date: Fecha
198 199 #label_integer: Integer
199 200 #label_boolean: Boolean
200 201 #label_string: String
201 202 #label_text: Text
202 203 #label_attribute: Attribute
203 204 #label_attribute_plural: Attributes
204 205 label_download: %d Telecarga
205 206 label_download_plural: %d Telecargas
206 207 #label_no_data: No data to display
207 208 label_change_status: Cambiar el estatuto
208 209 label_history: Histórico
209 210 label_attachment: Fichero
210 211 label_attachment_new: Nuevo fichero
211 212 #label_attachment_delete: Delete file
212 213 label_attachment_plural: Ficheros
213 214 #label_report: Report
214 215 #label_report_plural: Reports
215 216 label_news: Noticia
216 217 label_news_new: Nueva noticia
217 218 label_news_plural: Noticias
218 219 label_news_latest: Últimas noticias
219 220 label_news_view_all: Ver todas las noticias
220 221 label_change_log: Cambios
221 222 label_settings: Configuración
222 223 label_overview: Vistazo
223 224 label_version: Versión
224 225 label_version_new: Nueva versión
225 226 label_version_plural: Versiónes
226 227 label_confirmation: Confirmación
227 228 label_export_csv: Exportar a CSV
229 label_export_pdf: Exportar a PDF
228 230 label_read: Leer...
229 231 label_public_projects: Proyectos publicos
230 232 label_open_issues: Abierta
231 233 label_open_issues_plural: Abiertas
232 234 label_closed_issues: Cerrada
233 235 label_closed_issues_plural: Cerradas
234 236 label_total: Total
235 237 label_permissions: Permisos
236 238 #label_current_status: Current status
237 239 label_new_statuses_allowed: Nuevos estatutos autorizados
238 240 label_all: Todos
239 241 label_none: Ninguno
240 242 label_next: Próximo
241 243 label_previous: Precedente
242 244 label_used_by: Utilizado por
243 245 #label_details: Details...
244 246 #label_add_note: Add a note
247 #label_per_page: Per page
245 248
246 249 button_login: Conexión
247 250 button_submit: Someter
248 251 button_save: Validar
249 252 button_check_all: Seleccionar todo
250 253 button_uncheck_all: No seleccionar nada
251 254 button_delete: Suprimir
252 255 button_create: Crear
253 256 button_test: Testar
254 257 button_edit: Modificar
255 258 button_add: Añadir
256 259 button_change: Cambiar
257 260 button_apply: Aplicar
258 261 button_clear: Anular
259 262 button_lock: Bloquear
260 263 button_unlock: Desbloquear
261 264 button_download: Telecargar
262 265 button_list: Listar
263 266 button_view: Ver
264 267 button_move: Mover
265 268 #button_back: Back
266 269
267 270 text_select_mail_notifications: Seleccionar las actividades que necesitan la activación de la notificación por mail.
268 271 text_regexp_info: eg. ^[A-Z0-9]+$
269 272 text_min_max_length_info: 0 para ninguna restricción
270 273 #text_possible_values_info: values separated with |
271 274 text_project_destroy_confirmation: ¿ Estás seguro de querer eliminar el proyecto ?
272 275 text_workflow_edit: Seleccionar un workflow para actualizar
273 276 text_are_you_sure: ¿ Estás seguro ?
274 277
275 278 default_role_manager: Manager
276 279 default_role_developper: Desarrollador
277 280 default_role_reporter: Informador
278 281 default_tracker_bug: Anomalía
279 282 default_tracker_feature: Evolución
280 283 default_tracker_support: Asistencia
281 284 default_issue_status_new: Nuevo
282 285 default_issue_status_assigned: Asignada
283 286 default_issue_status_resolved: Resuelta
284 287 default_issue_status_feedback: Comentario
285 288 default_issue_status_closed: Cerrada
286 289 default_issue_status_rejected: Rechazada
287 290 default_doc_category_user: Documentación del usuario
288 291 default_doc_category_tech: Documentación tecnica
289 292 default_priority_low: Bajo
290 293 default_priority_normal: Normal
291 294 default_priority_high: Alto
292 295 default_priority_urgent: Urgente
293 296 default_priority_immediate: Ahora
294 297
295 298 enumeration_issue_priorities: Prioridad de las peticiones
296 299 enumeration_doc_categories: Categorías del documento
@@ -1,296 +1,299
1 1 _gloc_rule_default: '|n| n<=1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: Janvier,Février,Mars,Avril,Mai,Juin,Juillet,Août,Septembre,Octobre,Novembre,Décembre
5 5 actionview_datehelper_select_month_names_abbr: Jan,Fév,Mars,Avril,Mai,Juin,Juil,Août,Sept,Oct,Nov,Déc
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 jour
9 9 actionview_datehelper_time_in_words_day_plural: %d jours
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: 30 secondes
15 15 actionview_datehelper_time_in_words_minute_less_than: moins d'une minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: moins d'une seconde
19 19 actionview_datehelper_time_in_words_second_less_than_plural: moins de %d secondes
20 20 actionview_instancetag_blank_option: Choisir
21 21
22 22 activerecord_error_inclusion: n'est pas inclus dans la liste
23 23 activerecord_error_exclusion: est reservé
24 24 activerecord_error_invalid: est invalide
25 25 activerecord_error_confirmation: ne correspond pas à la confirmation
26 26 activerecord_error_accepted: doit être accepté
27 27 activerecord_error_empty: doit être renseigné
28 28 activerecord_error_blank: doit être renseigné
29 29 activerecord_error_too_long: est trop long
30 30 activerecord_error_too_short: est trop court
31 31 activerecord_error_wrong_length: n'est pas de la bonne longueur
32 32 activerecord_error_taken: est déjà utilisé
33 33 activerecord_error_not_a_number: n'est pas un nombre
34 34 activerecord_error_not_a_date: n'est pas une date valide
35 35
36 36 general_fmt_age: %d an
37 37 general_fmt_age_plural: %d ans
38 38 general_fmt_date: %%d/%%m/%%Y
39 39 general_fmt_datetime: %%d/%%m/%%Y %%H:%%M
40 40 general_fmt_datetime_short: %%d/%%m %%H:%%M
41 41 general_fmt_time: %%H:%%M
42 42 general_text_No: 'Non'
43 43 general_text_Yes: 'Oui'
44 44 general_text_no: 'non'
45 45 general_text_yes: 'oui'
46 46 general_lang_fr: 'Français'
47 general_csv_separator: ';'
47 48
48 49 notice_account_updated: Le compte a été mis à jour avec succès.
49 50 notice_account_invalid_creditentials: Identifiant ou mot de passe invalide.
50 51 notice_account_password_updated: Mot de passe mis à jour avec succès.
51 52 notice_account_wrong_password: Mot de passe incorrect
52 53 notice_account_register_done: Un message contenant les instructions pour activer votre compte vous a été envoyé.
53 54 notice_account_unknown_email: Aucun compte ne correspond à cette adresse.
54 55 notice_can_t_change_password: Ce compte utilise une authentification externe. Impossible de changer le mot de passe.
55 56 notice_account_lost_email_sent: Un message contenant les instructions pour choisir un nouveau mot de passe vous a été envoyé.
56 57 notice_account_activated: Votre compte a été activé. Vous pouvez à présent vous connecter.
57 58 notice_successful_create: Création effectuée avec succès.
58 59 notice_successful_update: Mise à jour effectuée avec succès.
59 60 notice_successful_delete: Suppression effectuée avec succès.
60 61 notice_successful_connection: Connection réussie.
61 62 notice_file_not_found: Le fichier demandé n'existe pas ou a été supprimé.
62 63 notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible.
63 64
64 65 gui_validation_error: 1 erreur
65 66 gui_validation_error_plural: %d erreurs
66 67
67 68 field_name: Nom
68 69 field_description: Description
69 70 field_summary: Résumé
70 71 field_is_required: Obligatoire
71 72 field_firstname: Prénom
72 73 field_lastname: Nom
73 74 field_mail: Email
74 75 field_filename: Fichier
75 76 field_filesize: Taille
76 77 field_downloads: Téléchargements
77 78 field_author: Auteur
78 79 field_created_on: Créé
79 80 field_updated_on: Mis à jour
80 81 field_field_format: Format
81 82 field_is_for_all: Pour tous les projets
82 83 field_possible_values: Valeurs possibles
83 84 field_regexp: Expression régulière
84 85 field_min_length: Longueur minimum
85 86 field_max_length: Longueur maximum
86 87 field_value: Valeur
87 88 field_category: Catégorie
88 89 field_title: Titre
89 90 field_project: Projet
90 91 field_issue: Demande
91 92 field_status: Statut
92 93 field_notes: Notes
93 94 field_is_closed: Demande fermée
94 95 field_is_default: Statut par défaut
95 96 field_html_color: Couleur
96 97 field_tracker: Tracker
97 98 field_subject: Sujet
98 99 field_due_date: Date d'échéance
99 100 field_assigned_to: Assigné à
100 101 field_priority: Priorité
101 102 field_fixed_version: Version corrigée
102 103 field_user: Utilisateur
103 104 field_role: Rôle
104 105 field_homepage: Site web
105 106 field_is_public: Public
106 107 field_parent: Sous-projet de
107 108 field_is_in_chlog: Demandes affichées dans l'historique
108 109 field_login: Identifiant
109 110 field_mail_notification: Notifications par mail
110 111 field_admin: Administrateur
111 112 field_locked: Verrouillé
112 113 field_last_login_on: Dernière connexion
113 114 field_language: Langue
114 115 field_effective_date: Date
115 116 field_password: Mot de passe
116 117 field_new_password: Nouveau mot de passe
117 118 field_password_confirmation: Confirmation
118 119 field_version: Version
119 120 field_type: Type
120 121 field_host: Hôte
121 122 field_port: Port
122 123 field_account: Compte
123 124 field_base_dn: Base DN
124 125 field_attr_login: Attribut Identifiant
125 126 field_attr_firstname: Attribut Prénom
126 127 field_attr_lastname: Attribut Nom
127 128 field_attr_mail: Attribut Email
128 129 field_onthefly: Création des utilisateurs à la volée
129 130
130 131 label_user: Utilisateur
131 132 label_user_plural: Utilisateurs
132 133 label_user_new: Nouvel utilisateur
133 134 label_project: Projet
134 135 label_project_new: Nouveau projet
135 136 label_project_plural: Projets
136 137 label_project_latest: Derniers projets
137 138 label_issue: Demande
138 139 label_issue_new: Nouvelle demande
139 140 label_issue_plural: Demandes
140 141 label_issue_view_all: Voir toutes les demandes
141 142 label_document: Document
142 143 label_document_new: Nouveau document
143 144 label_document_plural: Documents
144 145 label_role: Rôle
145 146 label_role_plural: Rôles
146 147 label_role_new: Nouveau rôle
147 148 label_role_and_permissions: Rôles et permissions
148 149 label_member: Membre
149 150 label_member_new: Nouveau membre
150 151 label_member_plural: Membres
151 152 label_tracker: Tracker
152 153 label_tracker_plural: Trackers
153 154 label_tracker_new: Nouveau tracker
154 155 label_workflow: Workflow
155 156 label_issue_status: Statut de demandes
156 157 label_issue_status_plural: Statuts de demandes
157 158 label_issue_status_new: Nouveau statut
158 159 label_issue_category: Catégorie de demandes
159 160 label_issue_category_plural: Catégories de demandes
160 161 label_issue_category_new: Nouvelle catégorie
161 162 label_custom_field: Champ personnalisé
162 163 label_custom_field_plural: Champs personnalisés
163 164 label_custom_field_new: Nouveau champ personnalisé
164 165 label_enumerations: Listes de valeurs
165 166 label_enumeration_new: Nouvelle valeur
166 167 label_information: Information
167 168 label_information_plural: Informations
168 169 label_please_login: Identification
169 170 label_register: S'enregistrer
170 171 label_password_lost: Mot de passe perdu
171 172 label_home: Accueil
172 173 label_my_page: Ma page
173 174 label_my_account: Mon compte
174 175 label_my_projects: Mes projets
175 176 label_administration: Administration
176 177 label_login: Connexion
177 178 label_logout: Déconnexion
178 179 label_help: Aide
179 180 label_reported_issues: Demandes soumises
180 181 label_assigned_to_me_issues: Demandes qui me sont assignées
181 182 label_last_login: Dernière connexion
182 183 label_last_updates: Dernière mise à jour
183 184 label_last_updates_plural: %d dernières mises à jour
184 185 label_registered_on: Inscrit le
185 186 label_activity: Activité
186 187 label_new: Nouveau
187 188 label_logged_as: Connecté en tant que
188 189 label_environment: Environnement
189 190 label_authentication: Authentification
190 191 label_auth_source: Mode d'authentification
191 192 label_auth_source_new: Nouveau mode d'authentification
192 193 label_auth_source_plural: Modes d'authentification
193 194 label_subproject: Sous-projet
194 195 label_subproject_plural: Sous-projets
195 196 label_min_max_length: Longueurs mini - maxi
196 197 label_list: Liste
197 198 label_date: Date
198 199 label_integer: Entier
199 200 label_boolean: Booléen
200 201 label_string: Chaîne
201 202 label_text: Texte
202 203 label_attribute: Attribut
203 204 label_attribute_plural: Attributs
204 205 label_download: %d Téléchargement
205 206 label_download_plural: %d Téléchargements
206 207 label_no_data: Aucune donnée à afficher
207 208 label_change_status: Changer le statut
208 209 label_history: Historique
209 210 label_attachment: Fichier
210 211 label_attachment_new: Nouveau fichier
211 212 label_attachment_delete: Supprimer le fichier
212 213 label_attachment_plural: Fichiers
213 214 label_report: Rapport
214 215 label_report_plural: Rapports
215 216 label_news: Annonce
216 217 label_news_new: Nouvelle annonce
217 218 label_news_plural: Annonces
218 219 label_news_latest: Dernières annonces
219 220 label_news_view_all: Voir toutes les annonces
220 221 label_change_log: Historique
221 222 label_settings: Configuration
222 223 label_overview: Aperçu
223 224 label_version: Version
224 225 label_version_new: Nouvelle version
225 226 label_version_plural: Versions
226 227 label_confirmation: Confirmation
227 228 label_export_csv: Exporter en CSV
229 label_export_pdf: Exporter en PDF
228 230 label_read: Lire...
229 231 label_public_projects: Projets publics
230 232 label_open_issues: Ouverte
231 233 label_open_issues_plural: Ouvertes
232 234 label_closed_issues: Fermée
233 235 label_closed_issues_plural: Fermées
234 236 label_total: Total
235 237 label_permissions: Permissions
236 238 label_current_status: Statut actuel
237 239 label_new_statuses_allowed: Nouveaux statuts autorisés
238 240 label_all: Tous
239 241 label_none: Aucun
240 242 label_next: Suivant
241 243 label_previous: Précédent
242 244 label_used_by: Utilisé par
243 245 label_details: Détails...
244 246 label_add_note: Ajouter une note
247 label_per_page: Par page
245 248
246 249 button_login: Connexion
247 250 button_submit: Soumettre
248 251 button_save: Valider
249 252 button_check_all: Tout cocher
250 253 button_uncheck_all: Tout décocher
251 254 button_delete: Supprimer
252 255 button_create: Créer
253 256 button_test: Tester
254 257 button_edit: Modifier
255 258 button_add: Ajouter
256 259 button_change: Changer
257 260 button_apply: Appliquer
258 261 button_clear: Effacer
259 262 button_lock: Verrouiller
260 263 button_unlock: Déverrouiller
261 264 button_download: Télécharger
262 265 button_list: Lister
263 266 button_view: Voir
264 267 button_move: Déplacer
265 268 button_back: Retour
266 269
267 270 text_select_mail_notifications: Sélectionner les actions pour lesquelles la notification par mail doit être activée.
268 271 text_regexp_info: ex. ^[A-Z0-9]+$
269 272 text_min_max_length_info: 0 pour aucune restriction
270 273 text_possible_values_info: valeurs séparées par |
271 274 text_project_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce projet et tout ce qui lui est rattaché ?
272 275 text_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow
273 276 text_are_you_sure: Etes-vous sûr ?
274 277
275 278 default_role_manager: Manager
276 279 default_role_developper: Développeur
277 280 default_role_reporter: Rapporteur
278 281 default_tracker_bug: Anomalie
279 282 default_tracker_feature: Evolution
280 283 default_tracker_support: Assistance
281 284 default_issue_status_new: Nouveau
282 285 default_issue_status_assigned: Assigné
283 286 default_issue_status_resolved: Résolu
284 287 default_issue_status_feedback: Commentaire
285 288 default_issue_status_closed: Fermé
286 289 default_issue_status_rejected: Rejeté
287 290 default_doc_category_user: Documentation utilisateur
288 291 default_doc_category_tech: Documentation technique
289 292 default_priority_low: Bas
290 293 default_priority_normal: Normal
291 294 default_priority_high: Haut
292 295 default_priority_urgent: Urgent
293 296 default_priority_immediate: Immédiat
294 297
295 298 enumeration_issue_priorities: Priorités des demandes
296 299 enumeration_doc_categories: Catégories des documents
@@ -1,409 +1,419
1 1 /* 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 */
2 2 /* Edited by Jean-Philippe Lang *>
3 3 /**************** Body and tag styles ****************/
4 4
5 5
6 6 #header * {margin:0; padding:0;}
7 7 p, ul, ol, li {margin:0; padding:0;}
8 8
9 9
10 10 body{
11 11 font:76% Verdana,Tahoma,Arial,sans-serif;
12 12 line-height:1.4em;
13 13 text-align:center;
14 14 color:#303030;
15 15 background:#e8eaec;
16 16 margin:0;
17 17 }
18 18
19 19
20 20 a{
21 21 color:#467aa7;
22 22 font-weight:bold;
23 23 text-decoration:none;
24 24 background-color:inherit;
25 25 }
26 26
27 27 a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;}
28 28 a img{border:none;}
29 29
30 30 p{padding:0 0 1em 0;}
31 31 p form{margin-top:0; margin-bottom:20px;}
32 32
33 33 img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;}
34 34 img.left{float:left; margin:0 12px 5px 0;}
35 35 img.center{display:block; margin:0 auto 5px auto;}
36 36 img.right{float:right; margin:0 0 5px 12px;}
37 37
38 38 /**************** Header and navigation styles ****************/
39 39
40 40 #container{
41 41 width:100%;
42 42 min-width: 800px;
43 43 margin:0;
44 44 padding:0;
45 45 text-align:left;
46 46 background:#ffffff;
47 47 color:#303030;
48 48 }
49 49
50 50 #header{
51 51 height:4.5em;
52 52 /*width:758px;*/
53 53 margin:0;
54 54 background:#467aa7;
55 55 color:#ffffff;
56 56 margin-bottom:1px;
57 57 }
58 58
59 59 #header h1{
60 60 padding:10px 0 0 20px;
61 61 font-size:1.8em;
62 62 background-color:inherit;
63 63 color:#fff; /*rgb(152, 26, 33);*/
64 64 letter-spacing:-2px;
65 65 font-weight:normal;
66 66 }
67 67
68 68 #header h2{
69 69 margin:3px 0 0 40px;
70 70 font-size:1.4em;
71 71 background-color:inherit;
72 72 color:#f0f2f4;
73 73 letter-spacing:-1px;
74 74 font-weight:normal;
75 75 }
76 76
77 77 #navigation{
78 78 height:2.2em;
79 79 line-height:2.2em;
80 80 /*width:758px;*/
81 81 margin:0;
82 82 background:#578bb8;
83 83 color:#ffffff;
84 84 }
85 85
86 86 #navigation li{
87 87 float:left;
88 88 list-style-type:none;
89 89 border-right:1px solid #ffffff;
90 90 white-space:nowrap;
91 91 }
92 92
93 93 #navigation li.right {
94 94 float:right;
95 95 list-style-type:none;
96 96 border-right:0;
97 97 border-left:1px solid #ffffff;
98 98 white-space:nowrap;
99 99 }
100 100
101 101 #navigation li a{
102 102 display:block;
103 103 padding:0px 10px 0px 22px;
104 104 font-size:0.8em;
105 105 font-weight:normal;
106 106 /*text-transform:uppercase;*/
107 107 text-decoration:none;
108 108 background-color:inherit;
109 109 color: #ffffff;
110 110 }
111 111
112 112 * html #navigation a {width:1%;}
113 113
114 114 #navigation .selected,#navigation a:hover{
115 115 color:#ffffff;
116 116 text-decoration:none;
117 117 background-color: #80b0da;
118 118 }
119 119
120 120 /**************** Icons links *******************/
121 121 .picHome { background: url(../images/home.png) no-repeat 4px 50%; }
122 122 .picUser { background: url(../images/user.png) no-repeat 4px 50%; }
123 123 .picUserPage { background: url(../images/user_page.png) no-repeat 4px 50%; }
124 124 .picAdmin { background: url(../images/admin.png) no-repeat 4px 50%; }
125 125 .picProject { background: url(../images/projects.png) no-repeat 4px 50%; }
126 126 .picLogout { background: url(../images/logout.png) no-repeat 4px 50%; }
127 127 .picHelp { background: url(../images/help.png) no-repeat 4px 50%; }
128 128
129 129 /**************** Content styles ****************/
130 130
131 131 html>body #content {
132 132 height: auto;
133 133 min-height: 300px;
134 134 }
135 135
136 136 #content{
137 137 /*float:right;*/
138 138 /*width:530px;*/
139 139 width: auto;
140 140 height:300px;
141 141 font-size:0.9em;
142 142 padding:20px 10px 10px 20px;
143 143 /*position: absolute;*/
144 144 margin-left: 120px;
145 145 border-left: 1px dashed #c0c0c0;
146 146
147 147 }
148 148
149 149 #content h2{
150 150 display:block;
151 151 margin:0 0 16px 0;
152 152 font-size:1.7em;
153 153 font-weight:normal;
154 154 letter-spacing:-1px;
155 155 color:#505050;
156 156 background-color:inherit;
157 157 }
158 158
159 159 #content h2 a{font-weight:normal;}
160 160 #content h3{margin:0 0 12px 0; font-size:1.4em; letter-spacing:-1px;}
161 161 #content a:hover,#subcontent a:hover{text-decoration:underline;}
162 162 #content ul,#content ol{margin:0 5px 16px 35px;}
163 163 #content dl{margin:0 5px 10px 25px;}
164 164 #content dt{font-weight:bold; margin-bottom:5px;}
165 165 #content dd{margin:0 0 10px 15px;}
166 166
167 167
168 168 /***********************************************/
169 169
170 170 /*
171 171 form{
172 172 padding:15px;
173 173 margin:0 0 20px 0;
174 174 border:1px solid #c0c0c0;
175 175 background-color:#CEE1ED;
176 176 width:600px;
177 177 }
178 178 */
179 179
180 180 form {
181 181 display: inline;
182 182 }
183 183
184 184 .noborder {
185 185 border:0px;
186 186 Exception exceptions.AssertionError: <exceptions.AssertionError instance at 0xb7c0b20c> in <bound
187 187 method SubversionRepository.__del__ of <vclib.svn.SubversionRepository instance at 0xb7c1252c>>
188 188 ignored
189 189
190 190 background-color:#fff;
191 191 width:100%;
192 192 }
193 193
194 194 textarea {
195 195 padding:0;
196 196 margin:0;
197 197 }
198 198
199 199 input {
200 200 vertical-align: middle;
201 201 }
202 202
203 203 input.button-small
204 204 {
205 205 font-size: 0.8em;
206 206 }
207 207
208 select {
209 vertical-align: middle;
210 }
211
208 212 select.select-small
209 213 {
210 214 border: 1px solid #7F9DB9;
211 padding: 1px;
215 padding: 1px;
212 216 font-size: 0.8em;
213 217 }
214 218
215 219 .active-filter
216 220 {
217 221 background-color: #F9FA9E;
218 222
219 223 }
220 224
221 225 label {
222 226 font-weight: bold;
223 227 font-size: 1em;
224 228 }
225 229
226 230 fieldset {
227 231 border:1px solid #7F9DB9;
228 232 padding: 6px;
229 233 }
230 234
231 235 legend {
232 236 color: #505050;
233 237
234 238 }
235 239
236 240 .required {
237 241 color: #bb0000;
238 242 }
239 243
240 244 table.listTableContent {
241 245 border:1px solid #578bb8;
242 246 width:99%;
243 247 border-collapse: collapse;
244 248 }
245 249
246 250 table.listTableContent td {
247 padding:4px;
251 padding:2px;
248 252 }
249 253
250 254 tr.ListHead {
251 255 background-color:#467aa7;
252 256 color:#FFFFFF;
253 257 text-align:center;
254 258 }
255 259
256 260 tr.ListHead a {
257 261 color:#FFFFFF;
258 262 text-decoration:underline;
259 263 }
260 264
261 265 tr.odd {
262 266 background-color:#f0f1f2;
263 267 }
264 268 tr.even {
265 269 background-color: #fff;
266 270 }
267 271
268 272 table.reportTableContent {
269 273 border:1px solid #c0c0c0;
270 274 width:99%;
271 275 border-collapse: collapse;
272 276 }
273 277
274 278 table.reportTableContent td {
275 279 padding:2px;
276 280 }
277 281
278 282 hr { border:none; border-bottom: dotted 2px #c0c0c0; }
279 283
280 284
281 285 /**************** Sidebar styles ****************/
282 286
283 287 #subcontent{
284 288 float:left;
285 289 clear:both;
286 290 width:110px;
287 291 padding:20px 20px 10px 5px;
288 292 }
289 293
290 294 #subcontent h2{
291 295 display:block;
292 296 margin:0 0 5px 0;
293 297 font-size:1.0em;
294 298 font-weight:bold;
295 299 text-align:left;
296 300 letter-spacing:-1px;
297 301 color:#606060;
298 302 background-color:inherit;
299 303 }
300 304
301 305 #subcontent p{margin:0 0 16px 0; font-size:0.9em;}
302 306
303 307 /**************** Menublock styles ****************/
304 308
305 309 .menublock{margin:0 0 20px 8px; font-size:0.8em;}
306 310 .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;}
307 311 .menublock li a{font-weight:bold; text-decoration:none;}
308 312 .menublock li a:hover{text-decoration:none;}
309 313 .menublock li ul{margin:0; font-size:1em; font-weight:normal;}
310 314 .menublock li ul li{margin-bottom:0;}
311 315 .menublock li ul a{font-weight:normal;}
312 316
313 317 /**************** Searchbar styles ****************/
314 318
315 319 #searchbar{margin:0 0 20px 0;}
316 320 #searchbar form fieldset{margin-left:10px; border:0 solid;}
317 321
318 322 #searchbar #s{
319 323 height:1.2em;
320 324 width:110px;
321 325 margin:0 5px 0 0;
322 326 border:1px solid #a0a0a0;
323 327 }
324 328
325 329 #searchbar #searchbutton{
326 330 width:auto;
327 331 padding:0 1px;
328 332 border:1px solid #808080;
329 333 font-size:0.9em;
330 334 text-align:center;
331 335 }
332 336
333 337 /**************** Footer styles ****************/
334 338
335 339 #footer{
336 340 clear:both;
337 341 /*width:758px;*/
338 342 padding:5px 0;
339 343 margin:0;
340 344 font-size:0.9em;
341 345 color:#f0f0f0;
342 346 background:#467aa7;
343 347 }
344 348
345 349 #footer p{padding:0; margin:0; text-align:center;}
346 350 #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;}
347 351 #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;}
348 352
349 353 /**************** Misc classes and styles ****************/
350 354
351 355 .splitcontentleft{float:left; width:49%;}
352 356 .splitcontentright{float:right; width:49%;}
353 357 .clear{clear:both;}
354 358 .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;}
355 359 .hide{display:none;}
356 360 .textcenter{text-align:center;}
357 361 .textright{text-align:right;}
358 362 .important{color:#f02025; background-color:inherit; font-weight:bold;}
359 363
360 364 .box{
361 365 margin:0 0 20px 0;
362 366 padding:10px;
363 367 border:1px solid #c0c0c0;
364 368 background-color:#fafbfc;
365 369 color:#505050;
366 370 line-height:1.5em;
367 371 }
368 372
373 .topright{
374 position: absolute;
375 right: 25px;
376 top: 100px;
377 }
378
369 379 .login {
370 380 width: 50%;
371 381 text-align: left;
372 382 }
373 383
374 384 img.calendar-trigger {
375 385 cursor: pointer;
376 386 vertical-align: middle;
377 387 margin-left: 4px;
378 388 }
379 389
380 390
381 391 /***** CSS FORM ******/
382 392 .tabular p{
383 393 margin: 0;
384 394 padding: 5px 0 8px 0;
385 395 padding-left: 180px; /*width of left column containing the label elements*/
386 396 height: 1%;
387 397 }
388 398
389 399 .tabular label{
390 400 font-weight: bold;
391 401 float: left;
392 402 margin-left: -180px; /*width of left column*/
393 403 width: 175px; /*width of labels. Should be smaller than left column to create some right
394 404 margin*/
395 405 }
396 406
397 407 .error {
398 408 color: #cc0000;
399 409 }
400 410
401 411
402 412 /*.threepxfix class below:
403 413 Targets IE6- ONLY. Adds 3 pixel indent for multi-line form contents.
404 414 to account for 3 pixel bug: http://www.positioniseverything.net/explorer/threepxtest.html
405 415 */
406 416
407 417 * html .threepxfix{
408 418 margin-left: 3px;
409 419 } No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now