Author: tchemit Date: 2011-06-04 16:36:54 +0200 (Sat, 04 Jun 2011) New Revision: 206 Url: http://nuiton.org/repositories/revision/jredmine/206 Log: - improve the management of versions in redmine plugin - improve controller design Modified: trunk/jredmine-client/src/main/redmine/jredmine/app/controllers/jredmine_controller.rb Modified: trunk/jredmine-client/src/main/redmine/jredmine/app/controllers/jredmine_controller.rb =================================================================== --- trunk/jredmine-client/src/main/redmine/jredmine/app/controllers/jredmine_controller.rb 2011-06-04 13:06:17 UTC (rev 205) +++ trunk/jredmine-client/src/main/redmine/jredmine/app/controllers/jredmine_controller.rb 2011-06-04 14:36:54 UTC (rev 206) @@ -24,6 +24,9 @@ ### class JredmineController < ActionController::Base + # post request + before_filter :check_post, :only => [:add_version, :update_version, :next_version, :add_news, :add_attachment, :add_version_attachment, :add_issue_time, :update_issue_time] + # find user (after login) before_filter :find_user, :only => [:get_user_projects, :add_version, :update_version, :next_version, :add_news, :add_attachment, :add_version_attachment, :add_issue_time, :update_issue_time] @@ -33,12 +36,12 @@ # find project's version before_filter :find_version, :only => [:get_version, :get_version_issues, :get_version_opened_issues, :get_version_attachments, :add_version_attachment] + # check version definition is ok in request + before_filter :check_version_definition, :only => [:add_version, :update_version, :next_version] + # find project's issue before_filter :find_issue, :only => [:get_issue_times, :add_issue_time, :update_time_issue] - # check can edit project before push requests - #before_filter :check_edit, :only => [:add_version, :update_version, :add_news, :add_attachment, :add_version_attachment, :add_issue_time, :update_issue_time] - # ping service (just to test if service is reachable) def ping render :text => "ping", :status => 200 @@ -96,7 +99,6 @@ render_array_result result, "projects" end - # recuperation des priorities d'issues def get_issue_priorities get_enumeration "IssuePriority" @@ -224,113 +226,104 @@ # add a new version for a given project def add_version(version = params["version"]) - if !request.post? - render_status 405, "POST method required for action add_version" + @version = @project.versions.find_by_name(version[:name]) + if @version + # version already exists + render_status 505, "Version #{@version.name} already exists for project #{@project.name}, can not create it" return false end + allowed = User.current.allowed_to?(:manage_versions, @project) + if !allowed + render_status 401, "No permission to add a version in project #{@project.name}" + return false + end + + # create the new version + @version = Version.create(:project => @project, :name => version[:name]) + + # do update the version + if !update_version0(version) + # something was wrong + return false + end + render_result @version + end + + # update a existing version for a given project + def update_version(version=params["version"]) + # get version @version = @project.versions.find_by_name(version[:name]) - if !@version - allowed = User.current.allowed_to?({:controller => 'projects', :action => "add_version"}, @project) - if !allowed - render_status 401, "No permission to add a version" - else - @version = Version.create(:project => @project, :name => version[:name]) - if version[:description] - @version['description'] = version[:description] - end - if version[:effective_date] - @version['effective_date'] = version[:effective_date] - end - if @version.save - render_result @version - else - render_status 505, "Could not add the version..." - end - end - else - render_result @version + if !@version + render_status 404, "#{version['name']} is not a version for project #{@project.name}" + return false end + # check permissions + allowed = User.current.allowed_to?({:controller => 'versions', :action => "edit"}, @project) + if !allowed + render_status 401, "No permission to edit a version on project #{@project.name}" + return false + end + # do update the version + if !update_version0(version) + # something was wrong + return false + end + render_result @version end - # add a new version for a given project + # add or update a new version for a given project and move all opened issue + # to next version from a preivous version def next_version(version = params["version"],old_version_name=params[:oldVersionName]) - if !request.post? - render_status 405, "POST method required for action next_version" - return false - end + # get version @version = @project.versions.find_by_name(version[:name]) if !@version - allowed = User.current.allowed_to?({:controller => 'projects', :action => "add_version"}, @project) + # version does does exists + allowed = User.current.allowed_to?(:manage_versions, @project) if !allowed - render_status 401, "No permission to add a version" - else - @version = Version.create(:project => @project, :name => version[:name]) - if version[:description] - @version['description'] = version[:description] - end - if version[:effective_date] - @version['effective_date'] = version[:effective_date] - end - if !@version.save - render_status 505, "Could not add the version..." - return false - end + render_status 401, "No permission to add a version on project #{@project.name}" + return false end + + # create the new version + @version = Version.create(:project => @project, :name => version[:name]) end + + # check update permission + allowed = User.current.allowed_to?({:controller => 'versions', :action => "edit"}, @project) + if !allowed + render_status 401, "No permission to edit a version on project #{@project.name}" + return false + end + + # do update the version + if !update_version0(version) + + # something was wrong while updating the version + return false + end + if old_version_name old_version = @project.versions.find_by_name(old_version_name) if !old_version - render_status 505, "Could not find old version " + old_version_name + render_status 505, "Could not find old version #{old_version_name} for project #{@project.name}" return false end old_issues = old_version.fixed_issues.find(:all) - #result =[] old_issues.each do |issue| sid = issue.status_id if !issue.closed? || ( sid == 1 || sid == 2 ) - #if !issue.closed? && issue.status_id != 3 journal = issue.init_journal(User.current, params[:notes]) + # move to new version issue.fixed_version_id = @version[:id] issue.save - #result << issue - Mailer.deliver_issue_edit(journal) if Setting.notified_events.include?('issue_updated') + #Mailer.deliver_issue_edit(journal) if Setting.notified_events.include?('issue_updated') end end - #render_array_result result, "issues" end render_result @version end - # update a existing version for a given project - def update_version(version=params["version"]) - if !request.post? - render_status 405, "POST method required for action update_version" - return false - end - @version = @project.versions.find_by_name(version[:name]) - if !@version - render_status 404, "The version " + version + " does not exist, can not update it..." - else - allowed = User.current.allowed_to?({:controller => 'versions', :action => "edit"}, @project) - if !allowed - render_status 401, "No permission to edit a version" - else - if version[:description] - @version['description'] = version[:description] - end - if version[:effective_date] - @version['effective_date'] = version[:effective_date] - end - if @version.save - render_result @version - else - render_status 505, "Could not update the version..." - end - end - end - end - # add a new news for a given project def add_news(news = params["news"]) if !request.post? @@ -429,7 +422,25 @@ end private - + + # Checks that action is using post method + def check_post + if !request.post? + render_status 405, "POST method required for action #{params[:action]}" + end + end + + # Checks that request has a version[name] attribute + def check_version_definition(version = params[:version]) + if version.nil? + render_status 404, "No version definition in request" + else + if version[:name].nil? + render_status 404, "No version name given in request" + end + end + end + def find_user # Check the settings cache for each request Setting.check_cache @@ -471,11 +482,15 @@ render_status 401, "No permission to edit the project" end end - + def find_version(version = params[:version_name]) - @version = @project.versions.find_by_name(version) - if !@version - render_status 404, "#{version} is not a version for project #{@project.name}" + if version.nil? + render_status 404, "No version name given in request" + else + @version = @project.versions.find_by_name(version) + if !@version + render_status 404, "#{version} is not a version for project #{@project.name}" + end end end @@ -485,7 +500,24 @@ render_status 404, "#{issue} is not an issue for project #{@project.name}" end end - + + # Update the version with the pa given in parameters. + # To use this method the @project and @version must defined + def update_version0(version) + attributes = version.dup + attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing']) + begin + valid = @version.update_attributes(attributes) + if !valid + render_status 505, "Could not update the version #{@version.name} on project #{@project.name} for unknown reason..." + end + rescue => msg + valid = false + render_status 505, "Could not update the version #{@version.name} on project #{@project.name} for reason #{msg}" + end + valid + end + def render_status(code,message) render :text => message, :status => code end