diff app/controllers/projects_controller.rb @ 1484:51364c0cd58f redmine-2.4-integration

Merge from live branch. Still need to merge manually in files overridden by plugins.
author Chris Cannam
date Wed, 15 Jan 2014 09:59:14 +0000
parents 261b3d9a4903 fc0fecf09eb9
children c86dacc2ef0a
line wrap: on
line diff
--- a/app/controllers/projects_controller.rb	Tue Jan 14 14:37:42 2014 +0000
+++ b/app/controllers/projects_controller.rb	Wed Jan 15 09:59:14 2014 +0000
@@ -20,8 +20,8 @@
   menu_item :roadmap, :only => :roadmap
   menu_item :settings, :only => :settings
 
-  before_filter :find_project, :except => [ :index, :list, :new, :create, :copy ]
-  before_filter :authorize, :except => [ :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy]
+  before_filter :find_project, :except => [ :index, :list, :explore, :new, :create, :copy ]
+  before_filter :authorize, :except => [ :index, :list, :explore, :new, :create, :copy, :archive, :unarchive, :destroy]
   before_filter :authorize_global, :only => [:new, :create]
   before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
   accept_rss_auth :index
@@ -44,16 +44,29 @@
   include RepositoriesHelper
   include ProjectsHelper
   helper :members
+  include ActivitiesHelper
+  helper :activities
 
-  # Lists visible projects
+  # Lists visible projects. Paginator is for top-level projects only
+  # (subprojects belong to them)
   def index
     respond_to do |format|
       format.html {
-        scope = Project
-        unless params[:closed]
-          scope = scope.active
-        end
-        @projects = scope.visible.order('lft').all
+        sort_init 'name'
+        sort_update %w(name lft created_on updated_on)
+        @limit = per_page_option
+        @project_count = Project.visible_roots.count
+        @project_pages = Paginator.new self, @project_count, @limit, params['page']
+        @offset ||= @project_pages.current.offset
+        @projects = Project.visible_roots.all(:offset => @offset, :limit => @limit, :order => sort_clause)
+        render :template => 'projects/index.html.erb', :layout => !request.xhr?
+
+## Redmine 2.2:
+#        scope = Project
+#        unless params[:closed]
+#          scope = scope.active
+#        end
+#        @projects = scope.visible.order('lft').all
       }
       format.api  {
         @offset, @limit = api_offset_and_limit
@@ -67,6 +80,16 @@
     end
   end
 
+  # A different view of projects using explore boxes
+  def explore
+    respond_to do |format|
+      format.html {
+        @projects = Project.visible
+        render :template => 'projects/explore.html.erb', :layout => !request.xhr?
+      }
+    end
+  end
+
   def new
     @issue_custom_fields = IssueCustomField.sorted.all
     @trackers = Tracker.sorted.all
@@ -80,7 +103,7 @@
     @project = Project.new
     @project.safe_attributes = params[:project]
 
-    if validate_parent_id && @project.save
+    if validate_is_public_key && validate_parent_id && @project.save
       @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
       # Add current user as a project member if current user is not admin
       unless User.current.admin?
@@ -171,6 +194,7 @@
     @issue_category ||= IssueCategory.new
     @member ||= @project.members.new
     @trackers = Tracker.sorted.all
+    @repository ||= @project.repository
     @wiki ||= @project.wiki
   end
 
@@ -199,6 +223,14 @@
     end
   end
 
+  def overview
+    @project.has_welcome_page = params[:has_welcome_page]
+    if @project.save
+      flash[:notice] = l(:notice_successful_update)
+    end
+    redirect_to :action => 'settings', :id => @project, :tab => 'overview'
+  end
+
   def modules
     @project.enabled_module_names = params[:enabled_module_names]
     flash[:notice] = l(:notice_successful_update)
@@ -245,6 +277,19 @@
 
   private
 
+  def validate_is_public_key
+    # Although is_public isn't mandatory in the project model (it gets
+    # defaulted), it must be present in params -- it can be true or
+    # false, but it must be there. This permits us to make forms in
+    # which the user _has_ to select public or private (rather than
+    # defaulting it) if we want to
+    if params.nil? || params[:project].nil? || !params[:project].has_key?(:is_public)
+      @project.errors.add :is_public, :public_or_private
+      return false
+    end
+    true
+  end
+
   # Validates parent_id param according to user's permissions
   # TODO: move it to Project model in a validation that depends on User.current
   def validate_parent_id