Project

General

Profile

Patch #4975 » 0001-Add-feature-to-automatically-archive-old-projects.patch

Impmenentation - Aaron Fischer, 2010-03-03 16:09

View differences:

app/controllers/projects_controller.rb
91 91
    @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
92 92
    @trackers = Tracker.all
93 93
    @root_projects = Project.find(:all,
94
                                  :conditions => "parent_id IS NULL AND status = #{Project::STATUS_ACTIVE}",
94
                                  :conditions => "parent_id IS NULL AND status < #{Project::STATUS_ARCHIVED}",
95 95
                                  :order => 'name')
96 96
    @source_project = Project.find(params[:id])
97 97
    if request.get?
......
371 371
  rescue ActiveRecord::RecordNotFound
372 372
    render_404
373 373
  end
374

  
375
  def reactivate
376
    @project = Project.find(params[:id])
377
    if @project.status == Project::STATUS_INACTIVE
378
      @project.status = Project::STATUS_ACTIVE
379
      @project.save!
380
      flash[:notice] = l(:notice_successful_reactivate)
381
    else
382
      flash[:error] = l(:error_failed_to_reactivate)
383
    end
384
    redirect_to(:controller => 'projects', :action => 'show', :id => @project)
385
  end
374 386
  
375 387
private
376 388
  # Find project of id params[:id]
app/controllers/sys_controller.rb
55 55
    render :nothing => true, :status => 404
56 56
  end
57 57

  
58
  def mark_all_inactive_projects
59
    date = Time.now.last_month
60
    (Project.active.select { |p| !p.active_since?(date) && p.created_on < date &&  p.descendants.size == 0 }).each do |p|
61
      p.status = Project::STATUS_INACTIVE
62
      (p.principals.select {|user| user.allowed_to?(:reactivate_project, p)}).each do |u|
63
        Mailer.deliver_inactive_reminder(u, p)
64
      end
65
      p.save
66
    end
67
    render :nothing => true, :status => 200
68
  end
69

  
70
  def archive_inactive_projects
71
    date = Time.now.last_month
72
    Project.find(:all, :conditions => {:status => Project::STATUS_INACTIVE}).each do |p|
73
      if p.active_since?(date)
74
        p.status = Project::STATUS_ACTIVE
75
      else
76
        p.archive
77
      end
78
      p.save
79
    end
80
    render :nothing => true, :status => 200
81
  end
82

  
58 83
  protected
59 84

  
60 85
  def check_enabled
app/models/mailer.rb
299 299

  
300 300
    s = ARCondition.new ["#{IssueStatus.table_name}.is_closed = ? AND #{Issue.table_name}.due_date <= ?", false, days.day.from_now.to_date]
301 301
    s << "#{Issue.table_name}.assigned_to_id IS NOT NULL"
302
    s << "#{Project.table_name}.status = #{Project::STATUS_ACTIVE}"
302
    s << "#{Project.table_name}.status < #{Project::STATUS_ARCHIVED}"
303 303
    s << "#{Issue.table_name}.project_id = #{project.id}" if project
304 304
    s << "#{Issue.table_name}.tracker_id = #{tracker.id}" if tracker
305 305

  
......
311 311
    end
312 312
  end
313 313

  
314
  def inactive_reminder(user, project)
315
    set_language_if_valid(user.language)
316
    recipients user.mail
317
    subject "[#{Setting.app_title.to_s} - #{l(:mail_subject_project_activity_warning)}] #{project.name}"
318
    body :project => project,
319
       :url => url_for(:controller => 'projects', :action => 'reactivate', :id => project)
320
    render_multipart('inactive_reminder', body)
321
  end
322

  
314 323
  private
315 324
  def initialize_defaults(method_name)
316 325
    super
app/models/principal.rb
19 19
  set_table_name 'users'
20 20

  
21 21
  has_many :members, :foreign_key => 'user_id', :dependent => :destroy
22
  has_many :memberships, :class_name => 'Member', :foreign_key => 'user_id', :include => [ :project, :roles ], :conditions => "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}", :order => "#{Project.table_name}.name"
22
  has_many :memberships, :class_name => 'Member', :foreign_key => 'user_id', :include => [ :project, :roles ], :conditions => "#{Project.table_name}.status < #{Project::STATUS_ARCHIVED}", :order => "#{Project.table_name}.name"
23 23
  has_many :projects, :through => :memberships
24 24

  
25 25
  # Groups and active users
app/models/project.rb
18 18
class Project < ActiveRecord::Base
19 19
  # Project statuses
20 20
  STATUS_ACTIVE     = 1
21
  STATUS_INACTIVE   = 5
21 22
  STATUS_ARCHIVED   = 9
22 23
  
23 24
  # Specific overidden Activities
......
77 78
  before_destroy :delete_all_members, :destroy_children
78 79

  
79 80
  named_scope :has_module, lambda { |mod| { :conditions => ["#{Project.table_name}.id IN (SELECT em.project_id FROM #{EnabledModule.table_name} em WHERE em.name=?)", mod.to_s] } }
80
  named_scope :active, { :conditions => "#{Project.table_name}.status = #{STATUS_ACTIVE}"}
81
  named_scope :active, { :conditions => "#{Project.table_name}.status < #{STATUS_ARCHIVED}"}
81 82
  named_scope :all_public, { :conditions => { :is_public => true } }
82 83
  named_scope :visible, lambda { { :conditions => Project.visible_by(User.current) } }
83 84
  
......
103 104
  def self.visible_by(user=nil)
104 105
    user ||= User.current
105 106
    if user && user.admin?
106
      return "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"
107
      return "#{Project.table_name}.status < #{Project::STATUS_ARCHIVED}"
107 108
    elsif user && user.memberships.any?
108
      return "#{Project.table_name}.status=#{Project::STATUS_ACTIVE} AND (#{Project.table_name}.is_public = #{connection.quoted_true} or #{Project.table_name}.id IN (#{user.memberships.collect{|m| m.project_id}.join(',')}))"
109
      return "#{Project.table_name}.status < #{Project::STATUS_ARCHIVED} AND (#{Project.table_name}.is_public = #{connection.quoted_true} or #{Project.table_name}.id IN (#{user.memberships.collect{|m| m.project_id}.join(',')}))"
109 110
    else
110
      return "#{Project.table_name}.status=#{Project::STATUS_ACTIVE} AND #{Project.table_name}.is_public = #{connection.quoted_true}"
111
      return "#{Project.table_name}.status < #{Project::STATUS_ARCHIVED} AND #{Project.table_name}.is_public = #{connection.quoted_true}"
111 112
    end
112 113
  end
113 114
  
114 115
  def self.allowed_to_condition(user, permission, options={})
115 116
    statements = []
116
    base_statement = "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"
117
    base_statement = "#{Project.table_name}.status < #{Project::STATUS_ARCHIVED}"
117 118
    if perm = Redmine::AccessControl.permission(permission)
118 119
      unless perm.project_module.nil?
119 120
        # If the permission belongs to a project module, make sure the module is enabled
......
217 218
  end
218 219
  
219 220
  def active?
220
    self.status == STATUS_ACTIVE
221
    self.status < STATUS_ARCHIVED
221 222
  end
222 223
  
223 224
  # Archives the project and its descendants
......
322 323
    @rolled_up_trackers ||=
323 324
      Tracker.find(:all, :include => :projects,
324 325
                         :select => "DISTINCT #{Tracker.table_name}.*",
325
                         :conditions => ["#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status = #{STATUS_ACTIVE}", lft, rgt],
326
                         :conditions => ["#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status < #{STATUS_ARCHIVED}", lft, rgt],
326 327
                         :order => "#{Tracker.table_name}.position")
327 328
  end
328 329
  
......
342 343
    @shared_versions ||= 
343 344
      Version.scoped(:include => :project,
344 345
                     :conditions => "#{Project.table_name}.id = #{id}" +
345
                                    " OR (#{Project.table_name}.status = #{Project::STATUS_ACTIVE} AND (" +
346
                                    " OR (#{Project.table_name}.status < #{Project::STATUS_ARCHIVED} AND (" +
346 347
                                          " #{Version.table_name}.sharing = 'system'" +
347 348
                                          " OR (#{Project.table_name}.lft >= #{root.lft} AND #{Project.table_name}.rgt <= #{root.rgt} AND #{Version.table_name}.sharing = 'tree')" +
348 349
                                          " OR (#{Project.table_name}.lft < #{lft} AND #{Project.table_name}.rgt > #{rgt} AND #{Version.table_name}.sharing IN ('hierarchy', 'descendants'))" +
......
497 498
    end
498 499
  end
499 500
  
501
  def active_since? date
502
    u = User.find(1)
503
    return Redmine::Activity::Fetcher.new(u, :project => self).events(date, Time.now).size > 0
504
  end
505

  
500 506
  private
501 507
  
502 508
  # Destroys children before destroying self
app/views/mailer/inactive_reminder.text.html.rhtml
1
<p><%= l(:mail_body_project_activity_warning, :project => @project.name) %></p><br />
2
<%= @url %>
app/views/mailer/inactive_reminder.text.plain.rhtml
1
<%= l(:mail_body_project_activity_warning, :project => @project.name) %>
2
<%= @url %>
config/locales/bg.yml
881 881
  permission_export_wiki_pages: Export wiki pages
882 882
  setting_cache_formatted_text: Cache formatted text
883 883
  permission_manage_project_activities: Manage project activities
884
  
884
  error_failed_to_reactivate: "Can't reactivate the project."
885
  notice_successful_reactivate: Successful reactivation.
886
  mail_subject_project_activity_warning: Activity reminder
887
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
888
  permission_reactivate_project: Reactivate Project
889

  
config/locales/bs.yml
905 905
  permission_export_wiki_pages: Export wiki pages
906 906
  setting_cache_formatted_text: Cache formatted text
907 907
  permission_manage_project_activities: Manage project activities
908
  error_failed_to_reactivate: "Can't reactivate the project."
909
  notice_successful_reactivate: Successful reactivation.
910
  mail_subject_project_activity_warning: Activity reminder
911
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
912
  permission_reactivate_project: Reactivate Project
config/locales/ca.yml
884 884
  permission_export_wiki_pages: Export wiki pages
885 885
  setting_cache_formatted_text: Cache formatted text
886 886
  permission_manage_project_activities: Manage project activities
887
  error_failed_to_reactivate: "Can't reactivate the project."
888
  notice_successful_reactivate: Successful reactivation.
889
  mail_subject_project_activity_warning: Activity reminder
890
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
891
  permission_reactivate_project: Reactivate Project
config/locales/cs.yml
887 887
  permission_export_wiki_pages: Export wiki pages
888 888
  setting_cache_formatted_text: Cache formatted text
889 889
  permission_manage_project_activities: Manage project activities
890
  error_failed_to_reactivate: "Can't reactivate the project."
891
  notice_successful_reactivate: Successful reactivation.
892
  mail_subject_project_activity_warning: Activity reminder
893
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
894
  permission_reactivate_project: Reactivate Project
config/locales/da.yml
907 907
  permission_export_wiki_pages: Export wiki pages
908 908
  setting_cache_formatted_text: Cache formatted text
909 909
  permission_manage_project_activities: Manage project activities
910
  error_failed_to_reactivate: "Can't reactivate the project."
911
  notice_successful_reactivate: Successful reactivation.
912
  mail_subject_project_activity_warning: Activity reminder
913
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
914
  permission_reactivate_project: Reactivate Project
config/locales/de.yml
907 907
  permission_export_wiki_pages: Wiki-Seiten exportieren
908 908
  setting_cache_formatted_text: Formattierten Text zwischenspeichern
909 909
  permission_manage_project_activities: Projektaktivitäten verwalten
910
  error_failed_to_reactivate: Das Projekt konnte nicht reaktiviert werden.
911
  notice_successful_reactivate: Erfolgreich reaktiviert.
912
  mail_subject_project_activity_warning: Aktivitätswarnung
913
  mail_body_project_activity_warning: |-
914
    Das Projekt "{{project}}" weist seit über einem Monat keine Aktivität mehr auf. Falls das Projekt
915
    nicht mehr benötigt wird, ignorieren sie diese E-Mail. In 14 Tagen wird das Projekt automatisch
916
    archiviert. Falls Sie das Projekt "{{project}}" noch benötigen, klicken sie auf folgenden Link,
917
    um es wieder zu aktivieren.
918
  permission_reactivate_project: Projekt reaktivieren.
config/locales/el.yml
887 887
  permission_export_wiki_pages: Export wiki pages
888 888
  setting_cache_formatted_text: Cache formatted text
889 889
  permission_manage_project_activities: Manage project activities
890
  error_failed_to_reactivate: "Can't reactivate the project."
891
  notice_successful_reactivate: Successful reactivation.
892
  mail_subject_project_activity_warning: Activity reminder
893
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
894
  permission_reactivate_project: Reactivate Project
config/locales/en.yml
139 139
  notice_successful_update: Successful update.
140 140
  notice_successful_delete: Successful deletion.
141 141
  notice_successful_connection: Successful connection.
142
  notice_successful_reactivate: Successful reactivation.
142 143
  notice_file_not_found: The page you were trying to access doesn't exist or has been removed.
143 144
  notice_locking_conflict: Data has been updated by another user.
144 145
  notice_not_authorized: You are not authorized to access this page.
......
165 166
  error_issue_done_ratios_not_updated: "Issue done ratios not updated."
166 167
  error_workflow_copy_source: 'Please select a source tracker or role'
167 168
  error_workflow_copy_target: 'Please select target tracker(s) and role(s)'
169
  error_failed_to_reactivate: "Can't reactivate the project."
168 170
  
169 171
  warning_attachments_not_saved: "{{count}} file(s) could not be saved."
170 172
  
......
182 184
  mail_body_wiki_content_added: "The '{{page}}' wiki page has been added by {{author}}."
183 185
  mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated"
184 186
  mail_body_wiki_content_updated: "The '{{page}}' wiki page has been updated by {{author}}."
187
  mail_subject_project_activity_warning: "Activity reminder"
188
  mail_body_project_activity_warning: "Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days."
185 189
  
186 190
  gui_validation_error: 1 error
187 191
  gui_validation_error_plural: "{{count}} errors"
......
385 389
  permission_delete_messages: Delete messages
386 390
  permission_delete_own_messages: Delete own messages
387 391
  permission_export_wiki_pages: Export wiki pages
392
  permission_reactivate_project: Reactivate Project
388 393
  
389 394
  project_module_issue_tracking: Issue tracking
390 395
  project_module_time_tracking: Time tracking
config/locales/es.yml
931 931
  permission_export_wiki_pages: Export wiki pages
932 932
  setting_cache_formatted_text: Cache formatted text
933 933
  permission_manage_project_activities: Manage project activities
934
  error_failed_to_reactivate: "Can't reactivate the project."
935
  notice_successful_reactivate: Successful reactivation.
936
  mail_subject_project_activity_warning: Activity reminder
937
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
938
  permission_reactivate_project: Reactivate Project
config/locales/fi.yml
917 917
  permission_export_wiki_pages: Export wiki pages
918 918
  setting_cache_formatted_text: Cache formatted text
919 919
  permission_manage_project_activities: Manage project activities
920
  error_failed_to_reactivate: "Can't reactivate the project."
921
  notice_successful_reactivate: Successful reactivation.
922
  mail_subject_project_activity_warning: Activity reminder
923
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
924
  permission_reactivate_project: Reactivate Project
config/locales/fr.yml
908 908
  enumeration_system_activity: Activité système
909 909
  label_board_sticky: Sticky
910 910
  label_board_locked: Verrouillé
911
  error_failed_to_reactivate: "Can't reactivate the project."
912
  notice_successful_reactivate: Successful reactivation.
913
  mail_subject_project_activity_warning: Activity reminder
914
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
915
  permission_reactivate_project: Reactivate Project
config/locales/gl.yml
907 907
  permission_export_wiki_pages: Export wiki pages
908 908
  setting_cache_formatted_text: Cache formatted text
909 909
  permission_manage_project_activities: Manage project activities
910
  error_failed_to_reactivate: "Can't reactivate the project."
911
  notice_successful_reactivate: Successful reactivation.
912
  mail_subject_project_activity_warning: Activity reminder
913
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
914
  permission_reactivate_project: Reactivate Project
config/locales/he.yml
891 891
  permission_export_wiki_pages: Export wiki pages
892 892
  setting_cache_formatted_text: Cache formatted text
893 893
  permission_manage_project_activities: Manage project activities
894
  error_failed_to_reactivate: "Can't reactivate the project."
895
  notice_successful_reactivate: Successful reactivation.
896
  mail_subject_project_activity_warning: Activity reminder
897
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
898
  permission_reactivate_project: Reactivate Project
config/locales/hr.yml
894 894
  permission_export_wiki_pages: Export wiki pages
895 895
  setting_cache_formatted_text: Cache formatted text
896 896
  permission_manage_project_activities: Manage project activities
897
  error_failed_to_reactivate: "Can't reactivate the project."
898
  notice_successful_reactivate: Successful reactivation.
899
  mail_subject_project_activity_warning: Activity reminder
900
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
901
  permission_reactivate_project: Reactivate Project
config/locales/hu.yml
912 912
  permission_export_wiki_pages: Export wiki pages
913 913
  setting_cache_formatted_text: Cache formatted text
914 914
  permission_manage_project_activities: Manage project activities
915
  error_failed_to_reactivate: "Can't reactivate the project."
916
  notice_successful_reactivate: Successful reactivation.
917
  mail_subject_project_activity_warning: Activity reminder
918
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
919
  permission_reactivate_project: Reactivate Project
config/locales/id.yml
899 899
  permission_export_wiki_pages: Export wiki pages
900 900
  setting_cache_formatted_text: Cache formatted text
901 901
  permission_manage_project_activities: Manage project activities
902
  error_failed_to_reactivate: "Can't reactivate the project."
903
  notice_successful_reactivate: Successful reactivation.
904
  mail_subject_project_activity_warning: Activity reminder
905
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
906
  permission_reactivate_project: Reactivate Project
config/locales/it.yml
894 894
  permission_export_wiki_pages: Export wiki pages
895 895
  setting_cache_formatted_text: Cache formatted text
896 896
  permission_manage_project_activities: Manage project activities
897
 
897
  error_failed_to_reactivate: "Can't reactivate the project."
898
  notice_successful_reactivate: Successful reactivation.
899
  mail_subject_project_activity_warning: Activity reminder
900
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
901
  permission_reactivate_project: Reactivate Project
config/locales/ja.yml
916 916
  enumeration_activities: 作業分類 (時間トラッキング)
917 917
  enumeration_system_activity: システム作業分類
918 918
  permission_manage_project_activities: Manage project activities
919
  error_failed_to_reactivate: "Can't reactivate the project."
920
  notice_successful_reactivate: Successful reactivation.
921
  mail_subject_project_activity_warning: Activity reminder
922
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
923
  permission_reactivate_project: Reactivate Project
config/locales/ko.yml
947 947
  permission_export_wiki_pages: Export wiki pages
948 948
  setting_cache_formatted_text: Cache formatted text
949 949
  permission_manage_project_activities: Manage project activities
950
  error_failed_to_reactivate: "Can't reactivate the project."
951
  notice_successful_reactivate: Successful reactivation.
952
  mail_subject_project_activity_warning: Activity reminder
953
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
954
  permission_reactivate_project: Reactivate Project
config/locales/lt.yml
955 955
  permission_export_wiki_pages: Export wiki pages
956 956
  setting_cache_formatted_text: Cache formatted text
957 957
  permission_manage_project_activities: Manage project activities
958
  error_failed_to_reactivate: "Can't reactivate the project."
959
  notice_successful_reactivate: Successful reactivation.
960
  mail_subject_project_activity_warning: Activity reminder
961
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
962
  permission_reactivate_project: Reactivate Project
config/locales/nl.yml
869 869
  permission_export_wiki_pages: Export wiki pages
870 870
  setting_cache_formatted_text: Cache formatted text
871 871
  permission_manage_project_activities: Manage project activities
872
  error_failed_to_reactivate: "Can't reactivate the project."
873
  notice_successful_reactivate: Successful reactivation.
874
  mail_subject_project_activity_warning: Activity reminder
875
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
876
  permission_reactivate_project: Reactivate Project
config/locales/no.yml
882 882
  permission_export_wiki_pages: Export wiki pages
883 883
  setting_cache_formatted_text: Cache formatted text
884 884
  permission_manage_project_activities: Manage project activities
885
  error_failed_to_reactivate: "Can't reactivate the project."
886
  notice_successful_reactivate: Successful reactivation.
887
  mail_subject_project_activity_warning: Activity reminder
888
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
889
  permission_reactivate_project: Reactivate Project
config/locales/pl.yml
912 912
  permission_export_wiki_pages: Eksport stron wiki
913 913
  permission_manage_project_activities: Zarządzanie aktywnościami projektu
914 914
  setting_cache_formatted_text: Cache formatted text
915
  error_failed_to_reactivate: "Can't reactivate the project."
916
  notice_successful_reactivate: Successful reactivation.
917
  mail_subject_project_activity_warning: Activity reminder
918
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
919
  permission_reactivate_project: Reactivate Project
config/locales/pt-BR.yml
915 915
  permission_export_wiki_pages: Export wiki pages
916 916
  setting_cache_formatted_text: Cache formatted text
917 917
  permission_manage_project_activities: Manage project activities
918
  error_failed_to_reactivate: "Can't reactivate the project."
919
  notice_successful_reactivate: Successful reactivation.
920
  mail_subject_project_activity_warning: Activity reminder
921
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
922
  permission_reactivate_project: Reactivate Project
config/locales/pt.yml
899 899
  permission_export_wiki_pages: Export wiki pages
900 900
  setting_cache_formatted_text: Cache formatted text
901 901
  permission_manage_project_activities: Manage project activities
902
  error_failed_to_reactivate: "Can't reactivate the project."
903
  notice_successful_reactivate: Successful reactivation.
904
  mail_subject_project_activity_warning: Activity reminder
905
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
906
  permission_reactivate_project: Reactivate Project
config/locales/ro.yml
884 884
  permission_export_wiki_pages: Export wiki pages
885 885
  setting_cache_formatted_text: Cache formatted text
886 886
  permission_manage_project_activities: Manage project activities
887
  error_failed_to_reactivate: "Can't reactivate the project."
888
  notice_successful_reactivate: Successful reactivation.
889
  mail_subject_project_activity_warning: Activity reminder
890
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
891
  permission_reactivate_project: Reactivate Project
config/locales/ru.yml
995 995
  permission_export_wiki_pages: Export wiki pages
996 996
  setting_cache_formatted_text: Cache formatted text
997 997
  permission_manage_project_activities: Manage project activities
998
  error_failed_to_reactivate: "Can't reactivate the project."
999
  notice_successful_reactivate: Successful reactivation.
1000
  mail_subject_project_activity_warning: Activity reminder
1001
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
1002
  permission_reactivate_project: Reactivate Project
config/locales/sk.yml
886 886
  permission_export_wiki_pages: Export wiki pages
887 887
  setting_cache_formatted_text: Cache formatted text
888 888
  permission_manage_project_activities: Manage project activities
889
  error_failed_to_reactivate: "Can't reactivate the project."
890
  notice_successful_reactivate: Successful reactivation.
891
  mail_subject_project_activity_warning: Activity reminder
892
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
893
  permission_reactivate_project: Reactivate Project
config/locales/sl.yml
883 883
  permission_export_wiki_pages: Export wiki pages
884 884
  setting_cache_formatted_text: Cache formatted text
885 885
  permission_manage_project_activities: Manage project activities
886
  error_failed_to_reactivate: "Can't reactivate the project."
887
  notice_successful_reactivate: Successful reactivation.
888
  mail_subject_project_activity_warning: Activity reminder
889
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
890
  permission_reactivate_project: Reactivate Project
config/locales/sr.yml
902 902
  permission_export_wiki_pages: Export wiki pages
903 903
  setting_cache_formatted_text: Cache formatted text
904 904
  permission_manage_project_activities: Manage project activities
905
  error_failed_to_reactivate: "Can't reactivate the project."
906
  notice_successful_reactivate: Successful reactivation.
907
  mail_subject_project_activity_warning: Activity reminder
908
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
909
  permission_reactivate_project: Reactivate Project
config/locales/sv.yml
936 936
  permission_export_wiki_pages: Export wiki pages
937 937
  setting_cache_formatted_text: Cache formatted text
938 938
  permission_manage_project_activities: Manage project activities
939
  error_failed_to_reactivate: "Can't reactivate the project."
940
  notice_successful_reactivate: Successful reactivation.
941
  mail_subject_project_activity_warning: Activity reminder
942
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
943
  permission_reactivate_project: Reactivate Project
config/locales/th.yml
884 884
  permission_export_wiki_pages: Export wiki pages
885 885
  setting_cache_formatted_text: Cache formatted text
886 886
  permission_manage_project_activities: Manage project activities
887
  error_failed_to_reactivate: "Can't reactivate the project."
888
  notice_successful_reactivate: Successful reactivation.
889
  mail_subject_project_activity_warning: Activity reminder
890
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
891
  permission_reactivate_project: Reactivate Project
config/locales/tr.yml
914 914
  permission_export_wiki_pages: Export wiki pages
915 915
  setting_cache_formatted_text: Cache formatted text
916 916
  permission_manage_project_activities: Manage project activities
917
  error_failed_to_reactivate: "Can't reactivate the project."
918
  notice_successful_reactivate: Successful reactivation.
919
  mail_subject_project_activity_warning: Activity reminder
920
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
921
  permission_reactivate_project: Reactivate Project
config/locales/uk.yml
883 883
  permission_export_wiki_pages: Export wiki pages
884 884
  setting_cache_formatted_text: Cache formatted text
885 885
  permission_manage_project_activities: Manage project activities
886
  error_failed_to_reactivate: "Can't reactivate the project."
887
  notice_successful_reactivate: Successful reactivation.
888
  mail_subject_project_activity_warning: Activity reminder
889
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
890
  permission_reactivate_project: Reactivate Project
config/locales/vi.yml
946 946
  permission_export_wiki_pages: Export wiki pages
947 947
  setting_cache_formatted_text: Cache formatted text
948 948
  permission_manage_project_activities: Manage project activities
949
  error_failed_to_reactivate: "Can't reactivate the project."
950
  notice_successful_reactivate: Successful reactivation.
951
  mail_subject_project_activity_warning: Activity reminder
952
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
953
  permission_reactivate_project: Reactivate Project
config/locales/zh-TW.yml
978 978
  permission_export_wiki_pages: Export wiki pages
979 979
  setting_cache_formatted_text: Cache formatted text
980 980
  permission_manage_project_activities: Manage project activities
981
  error_failed_to_reactivate: "Can't reactivate the project."
982
  notice_successful_reactivate: Successful reactivation.
983
  mail_subject_project_activity_warning: Activity reminder
984
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
985
  permission_reactivate_project: Reactivate Project
config/locales/zh.yml
909 909
  permission_export_wiki_pages: Export wiki pages
910 910
  setting_cache_formatted_text: Cache formatted text
911 911
  permission_manage_project_activities: Manage project activities
912
 
912
  error_failed_to_reactivate: "Can't reactivate the project."
913
  notice_successful_reactivate: Successful reactivation.
914
  mail_subject_project_activity_warning: Activity reminder
915
  mail_body_project_activity_warning: Your project '{{project}}' has no activity for a month. If you still need the project, click the following link, otherwise the project will be archived in 14 days.
916
  permission_reactivate_project: Reactivate Project
config/routes.rb
184 184
      project_views.connect 'projects/:id/versions/new', :action => 'add_version'
185 185
      project_views.connect 'projects/:id/categories/new', :action => 'add_issue_category'
186 186
      project_views.connect 'projects/:id/settings/:tab', :action => 'settings'
187
      project_views.connect 'projects/:id/reactivate', :action => 'reactivate'
187 188
    end
188 189

  
189 190
    projects.with_options :action => 'activity', :conditions => {:method => :get} do |activity|
lib/redmine.rb
33 33
  map.permission :manage_members, {:projects => :settings, :members => [:new, :edit, :destroy, :autocomplete_for_member]}, :require => :member
34 34
  map.permission :manage_versions, {:projects => [:settings, :add_version], :versions => [:edit, :close_completed, :destroy]}, :require => :member
35 35
  map.permission :add_subprojects, {:projects => :add}, :require => :member
36
  map.permission :reactivate_project, {:projects => :reactivate}, :require => :member
36 37
  
37 38
  map.project_module :issue_tracking do |map|
38 39
    # Issue categories
    (1-1/1)