Plugin converison from 4.0.3 to 4.2.1

Added by Federico Vergelli about 1 month ago

Hello!

I've been trying to make a plugin work on a Redmine 4.2.1.stable. I already have this plugin running in a 4.0.3.stable version, and works well.

( the plugin is project_accordion: https://github.com/reubenmallaby/redmine_projects_accordion )

The thing is, that I need this plugin on my 4.2 Redmine and I can't go back to an older version sadly. I thought that maybe I can convert this plugin into something that can work with version 4.2 of Redmine. Here is the thing, I've never done anything on Ruby and I just started a Rails course, so my knowledge of it is very limited. But I figured some things out.

Maybe you guys could guide me and tell me if it is viable or not, if it's gonna take me a few days to achieve this, or maybe it's just a few lines of code and that's it, Idk.

Plattaform:
  • Redmine 4.2.1 on Docker container
  • Redmine 4.0.3 on CentOS8 Installed locally

Behavior on 4.2.1: With the plugin installed, an Internal Error (500) is triggered whenever I click on Projects.

The log:

.
.
redmine_1      | I, [2021-09-01T21:04:07.346250 #1]  INFO -- :   Current user: admin (id=1)
redmine_1      | I, [2021-09-01T21:04:07.350804 #1]  INFO -- :   Rendering welcome/index.html.erb within layouts/base
redmine_1      | I, [2021-09-01T21:04:07.354260 #1]  INFO -- :   Rendered welcome/index.html.erb within layouts/base (3.3ms)
redmine_1      | I, [2021-09-01T21:04:07.408304 #1]  INFO -- : Completed 200 OK in 83ms (Views: 54.7ms | ActiveRecord: 18.3ms)
redmine_1      | I, [2021-09-01T21:04:14.210157 #1]  INFO -- : Started GET "/projects" for <ip> at 2021-09-01 21:04:14 +0000
redmine_1      | I, [2021-09-01T21:04:14.212257 #1]  INFO -- : Processing by ProjectsController#index as HTML
redmine_1      | I, [2021-09-01T21:04:14.221146 #1]  INFO -- :   Current user: admin (id=1)
redmine_1      | I, [2021-09-01T21:04:14.301931 #1]  INFO -- :   Rendering plugins/redmine_projects_accordion/app/views/projects/index.html.erb within layouts/base
redmine_1      | I, [2021-09-01T21:04:14.309838 #1]  INFO -- :   Rendered plugins/redmine_projects_accordion/app/views/projects/index.html.erb within layouts/base (7.8ms)
redmine_1      | I, [2021-09-01T21:04:14.310107 #1]  INFO -- : Completed 500 Internal Server Error in 98ms (ActiveRecord: 16.0ms)
redmine_1      | F, [2021-09-01T21:04:14.311105 #1] FATAL -- :   
redmine_1      | F, [2021-09-01T21:04:14.311150 #1] FATAL -- : ActionView::Template::Error (undefined method `delete_if' for nil:NilClass):
redmine_1      | F, [2021-09-01T21:04:14.311317 #1] FATAL -- :     18:   </form>
redmine_1      |     19: </h2>
redmine_1      |     20: 
redmine_1      |     21: <% @projects.delete_if { |p| !p.active? } -%>
redmine_1      |     22: 
redmine_1      |     23: <% ids = @projects.map { |p| p.id } %> 
redmine_1      |     24: <%- #unless p.children.empty? } %>
redmine_1      | F, [2021-09-01T21:04:14.311363 #1] FATAL -- :   
redmine_1      | F, [2021-09-01T21:04:14.311394 #1] FATAL -- : plugins/redmine_projects_accordion/app/views/projects/index.html.erb:21:in `_plugins_redmine_projects_accordion_app_views_projects_index_html_erb__4397864275038323496_111340'
redmine_1      | lib/redmine/sudo_mode.rb:61:in `sudo_mode'
redmine_1      | plugins/redmine_dmsf/lib/redmine_dmsf/webdav/custom_middleware.rb:56:in `call'
redmine_1      | I, [2021-09-01T21:04:21.026728 #1]  INFO -- : Started GET "/projects" for <ip> at 2021-09-01 21:04:21 +0000
redmine_1      | I, [2021-09-01T21:04:21.028229 #1]  INFO -- : Processing by ProjectsController#index as HTML
redmine_1      | I, [2021-09-01T21:04:21.035672 #1]  INFO -- :   Current user: admin (id=1)
.
.

As you can see here, the problem arises from line

21: <% @projects.delete_if { |p| !p.active? } -%>

with an error:

ActionView::Template::Error (undefined method `delete_if' for nil:NilClass):

I came up with the idea that maybe the variable "@projects" is returning a nill state instead of a list because is not defined or something, so I went to the projects_controller inside /app/controllers folder of my 4.0.3.stable Redmine just to compare it with the 4.2 one, and found this:

4.2.1

  # Lists visible projects
  def index
    # try to redirect to the requested menu item
    if params[:jump] && redirect_to_menu_item(params[:jump])
      return
    end

    retrieve_project_query
    scope = project_scope

    respond_to do |format|
      format.html do
        # TODO: see what to do with the board view and pagination
        if @query.display_type == 'board'
          @entries = scope.to_a
        else
          @entry_count = scope.count
          @entry_pages = Paginator.new @entry_count, per_page_option, params['page']
          @entries = scope.offset(@entry_pages.offset).limit(@entry_pages.per_page).to_a
        end
      end
      format.api do
        @offset, @limit = api_offset_and_limit
        @project_count = scope.count
        @projects = scope.offset(@offset).limit(@limit).to_a
      end
      format.atom do
        projects = scope.reorder(:created_on => :desc).limit(Setting.feeds_limit.to_i).to_a
        render_feed(projects, :title => "#{Setting.app_title}: #{l(:label_project_latest)}")
      end

4.0.3

  # Lists visible projects
  def index
    # try to redirect to the requested menu item
    if params[:jump] && redirect_to_menu_item(params[:jump])
      return
    end

    scope = Project.visible.sorted

    respond_to do |format|
      format.html {
        unless params[:closed]
          scope = scope.active
        end
        @projects = scope.to_a
      }
      format.api  {
        @offset, @limit = api_offset_and_limit
        @project_count = scope.count
        @projects = scope.offset(@offset).limit(@limit).to_a
      }
      format.atom {
        projects = scope.reorder(:created_on => :desc).limit(Setting.feeds_limit.to_i).to_a
        render_feed(projects, :title => "#{Setting.app_title}: #{l(:label_project_latest)}")
      }
    end
  end

Seems like @projects is an array defined based on the scope variable, but its occurrence is only on the 4.0.3 version. On 4.2.1 on the other hand, I only can see the @entries variable on its place.

What are your thoughts? I know I may be asking for too much, but any guidance would be very appreciated.

Regards.