Author: tchemit Date: 2009-09-12 13:50:33 +0200 (Sat, 12 Sep 2009) New Revision: 89 Added: maven-redmine-plugin/trunk/src/main/assembly/ maven-redmine-plugin/trunk/src/main/assembly/redmine_rest_plugin.xml maven-redmine-plugin/trunk/src/main/redmine/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/README.rdoc maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/app/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/app/controllers/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/app/controllers/rest_controller.rb maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/app/helpers/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/app/models/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/app/views/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/assets/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/assets/images/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/assets/javascripts/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/assets/stylesheets/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/db/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/db/migrate/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/init.rb maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/lang/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/lang/en.yml maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/lib/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/lib/tasks/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/test/ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/test/functional/ Modified: maven-redmine-plugin/trunk/pom.xml Log: adding the redmine rest plugin part of the project Modified: maven-redmine-plugin/trunk/pom.xml =================================================================== --- maven-redmine-plugin/trunk/pom.xml 2009-09-11 23:41:26 UTC (rev 88) +++ maven-redmine-plugin/trunk/pom.xml 2009-09-12 11:50:33 UTC (rev 89) @@ -87,7 +87,7 @@ <!-- ************************************************************* --> <!-- *** Project Information ************************************* --> <!-- ************************************************************* --> - <name>Redmine maven plugin (new one)</name> + <name>Redmine maven plugin</name> <description>A plugin to interacts with Redmine's server</description> @@ -561,6 +561,76 @@ <profiles> <profile> + <id>release-profile</id> + <activation> + <property> + <name>performRelease</name> + <value>true</value> + </property> + </activation> + <build> + <plugins> + + <!-- always compute source jar --> + <plugin> + <artifactId>maven-source-plugin</artifactId> + <executions> + <execution> + <id>attach-sources</id> + </execution> + </executions> + </plugin> + + <!-- always compute javadoc jar --> + <plugin> + <artifactId>maven-javadoc-plugin</artifactId> + <executions> + <execution> + <id>attach-javadocs</id> + </execution> + </executions> + </plugin> + + <!-- always add license and third-party files to classpath --> + <plugin> + <groupId>org.nuiton</groupId> + <artifactId>maven-helper-plugin</artifactId> + <executions> + <execution> + <id>attach-licenses</id> + <goals> + <goal>add-license</goal> + <goal>add-third-party</goal> + </goals> + </execution> + </executions> + </plugin> + + <!-- launch in a release the assembly automaticly --> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <executions> + <execution> + <id>create-assemblies</id> + <phase>verify</phase> + <goals> + <goal>single</goal> + </goals> + </execution> + </executions> + <configuration> + <attach>true</attach> + <descriptors> + <descriptor>src/main/assembly/redmine_rest_plugin.xml</descriptor> + </descriptors> + </configuration> + </plugin> + </plugins> + + </build> + </profile> + + <profile> <id>run-its</id> <build> <plugins> Added: maven-redmine-plugin/trunk/src/main/assembly/redmine_rest_plugin.xml =================================================================== --- maven-redmine-plugin/trunk/src/main/assembly/redmine_rest_plugin.xml (rev 0) +++ maven-redmine-plugin/trunk/src/main/assembly/redmine_rest_plugin.xml 2009-09-12 11:50:33 UTC (rev 89) @@ -0,0 +1,16 @@ +<assembly> + <id>redmine_rest_plugin</id> + <formats> + <format>zip</format> + </formats> + <includeBaseDirectory>false</includeBaseDirectory> + <fileSets> + <fileSet> + <directory>src/main/redmine/redmine_rest</directory> + <outputDirectory>redmine_rest</outputDirectory> + <includes> + <include>**/*</include> + </includes> + </fileSet> + </fileSets> +</assembly> \ No newline at end of file Added: maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/README.rdoc =================================================================== --- maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/README.rdoc (rev 0) +++ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/README.rdoc 2009-09-12 11:50:33 UTC (rev 89) @@ -0,0 +1,33 @@ += rest + +This plugin expose some services via a the REST protocol: + +rest/get_projects +rest/get_issue_statuses +rest/get_issue_priorities + +rest/get_project/X + +rest/get_project_trackers/X +rest/get_project_issue_categories/X +rest/get_project_users/X +rest/get_project_versions/X + +rest/get_version/X?version_name=Y +rest/get_version_issues/X?version_name=Y +rest/get_version_attachements/X?version_name=Y + +where X is a project identifier and Y a version name + +You have to add those lines to config/routes.rb + +# rest : ping, login , logout, with no project context... +map.connect 'rest/:action', :controller => 'rest' ,:action => ['ping', 'login', 'logout', 'get_projects', 'get_issue_statuses', 'get_issue_priorities'] +map.connect 'rest/:action.:format', :controller => 'rest' ,:action => ['get_projects', 'get_issue_statuses', 'get_issue_priorities'], :format => ['xml', 'json'] + +# rest/action/?? (:project_id) +map.connect 'rest/:action/:project_id', :controller => 'rest' ,:action => ['get_project', 'get_project_users', 'get_project_trackers', 'get_project_versions', 'get_version','get_version_issues', 'get_version_files', 'add_version','get_issue_categories'] +map.connect 'rest/:action.:format/:project_id', :controller => 'rest' ,:action => ['get_project', 'get_project_users', 'get_project_trackers', 'get_project_versions', 'get_version','get_version_issues', 'get_version_files', 'add_version', 'get_issue_categories' ], :format => ['xml', 'json'] + + + Added: maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/app/controllers/rest_controller.rb =================================================================== --- maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/app/controllers/rest_controller.rb (rev 0) +++ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/app/controllers/rest_controller.rb 2009-09-12 11:50:33 UTC (rev 89) @@ -0,0 +1,280 @@ +class RestController < ActionController::Base + +# find user (after login) +before_filter :find_user, :except => [:ping, :login] + +# find project and check permission +before_filter :find_project, :except => [:ping, :login, :logout, :get_projects, :get_issue_statuses, :get_issue_priorities] + +# get project's version +before_filter :find_version, :only => [:get_version, :get_version_issues, :get_version_files] + +# get project's version +#before_filter :check_edit, :only => [:add_version, :add_file, :add_news] + + # ping service (just to test if service is reachable) + def ping + render :text => "ping", :status => 200 + end + + # Login request and validation + def login + if request.get? + # Logout user : get method not possible + self.logged_user = nil + render_status 405, "POST method required" + else + # Authenticate user + user = User.try_to_login(params[:username], params[:password]) + if user.nil? + # Invalid credentials + render_status 401, "Invalid credentials" + elsif user.new_record? + # Onthefly creation failed, + render_status 401, "User not activated" + else + # Valid user + self.logged_user = user + # always generate a key and set autologin cookie + token = Token.create(:user => user, :action => 'autologin') + cookies[:autologin] = { :value => token.value, :expires => 1.year.from_now } + render_status 200, "User logged in" + end + end + end + + # Log out current user and redirect to welcome page + def logout + cookies.delete :autologin + Token.delete_all(["user_id = ? AND action = ?", User.current.id, 'autologin']) if User.current.logged? + # user is no more connected + self.logged_user = nil + render_status 200, "User logged out" + end + + # recuperation des projets + def get_projects + @projects = Project.find(:all) + render_array_result @projects, "projects" + end + + # recuperation des priorities d'issues + def get_issue_priorities + get_enumeration "IPRI" + end + + # recuperation des differentes categories d'issues + def get_issue_categories + @issue_categories = @project.issue_categories.find(:all) + render_array_result @issue_categories, "issue_categories" + end + + # recuperation des differentes statuts d'issues + def get_issue_statuses + @issue_status = IssueStatus.find(:all) + render_array_result @issue_status, "issue_statuses" + end + # recuperation du projet + def get_project + render_result @project + end + + # recuperation de tous les membres d'un projet + def get_project_users + @members = @project.members.find(:all) + @r = [] + for m in @members + u = User.find(m[:user_id]) + u[:role_id] = m[:role_id] + u[:member_id] = m[:id] + #TODO - should remove the hashed password ? + @r << u + end + render_array_result @r, "users" + end + + # recuperation des trakers d'un projet + def get_project_trackers + @trackers = @project.trackers.find(:all) + render_array_result @trackers, "trackers" + end + + # recuperation des versions d'un projet + def get_project_versions + @versions = @project.versions.find(:all) + render_array_result @versions, "versions" + end + + # recuperation de la version d'un projet + def get_version + render_result @version + end + + + # recuperation des issues d'un projet pour une version donnee + def get_version_issues + @issues = @version.fixed_issues.find(:all) + render_array_result @issues, "issues" + end + + # recuperation des fichiers d'un projet pour une version donnee + def get_version_files + @files = @version.attachments.find(:all) + render_array_result @files, "attachments" + end + + def add_version(version=params[:version], description = params[:description], date = params[:date]) + @version = @project.versions.find_by_name(version) + if !@version + allowed = User.current.allowed_to?({:controller => 'projects', :action => "add_version"}, @project) + if !allowed + render_status 401, "No permission to add a version" + return false + end + @version = Version.create(:project => @project, :name => version) + else + allowed = User.current.allowed_to?({:controller => 'versions', :action => "edit"}, @project) + if !allowed + render_status 401, "No permission to edit a version" + return false + end + end + if description + @version['description'] = description + end + if date + @version['effective_date'] = date + end + @version.save + render_result @version + end + + def add_version2(version=params[:version], description = params[:description], date = params[:date]) + allowed = User.current.allowed_to?({:controller => 'projects', :action => "manage_versions"}, @project) + if !allowed + render_status 401, "No permission to manage versions" + return false + end + @version = @project.versions.find_by_name(version) + if !@version + @version = Version.create(:project => @project, :name => version) + end + if description + @version['description'] = description + end + if date + @version['effective_date'] = date + end + @version.save + render_result @version + end + + def add_news + end + + + def add_file + end + +private + + def find_user + # Check the settings cache for each request + Setting.check_cache + # Find the current user + User.current = find_current_user + if !session[:user_id] + render_status 401, "Not connected" + end + end + + # Returns the current user or nil if no user is logged in + def find_current_user + if session[:user_id] + # existing session + (User.active.find(session[:user_id]) rescue nil) + elsif cookies[:autologin] + # auto-login feature + User.find_by_autologin_key(cookies[:autologin]) + end + end + + def find_project(ctrl = params[:controller]) + begin + @project = Project.find(params[:project_id]) + allowed = User.current.allowed_to?({:controller => 'rest', :action => "allow_rest"}, @project) + if !allowed + render_status 401, "No permission to access project nor rest service" + end + rescue ActiveRecord::RecordNotFound + render_status 404, "#{params[:project_id]} is not a project" + return false + end + end + + # recuperation des valeurs d'une enumration + def get_enumeration(type = params[:type]) + @result = Enumeration.get_values(type) + render_array_result @result, "enumerations" + end + + def check_edit + # check if user can edit the project + allowed = User.current.allowed_to?({:controller => 'projects', :action => "edit"}, @project) + if !allowed + 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}" + end + end + + def render_status(code,message) + render :text => message, :status => code + end + + def render_array_result(result,tag) + if !result.any? + respond_to do |format| + format.json { render :text => "[]" } + format.xml { render :text => "<"+tag+"></"+tag+">" } + end + else + respond_to do |format| + format.json { render :text => result.to_json } + format.xml { render :text => result.to_xml } + end + end + end + def render_result(result) + respond_to do |format| + format.json { render :text => result.to_json } + format.xml { render :text => result.to_xml } + end + end + + def logged_user=(user) + if user && user.is_a?(User) + User.current = user + session[:user_id] = user.id + else + User.current = User.anonymous + session[:user_id] = nil + end + end + + def allowed_permissions + @allowed_permissions ||= begin + module_names = @project.enabled_modules.collect {|m| m.name} + Redmine::AccessControl.modules_permissions(module_names).collect {|p| p.name} + end + end + def allowed_actions + @actions_allowed ||= allowed_permissions.inject([]) { |actions, permission| actions += Redmine::AccessControl.allowed_actions(permission) }.flatten + end + +end Added: maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/init.rb =================================================================== --- maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/init.rb (rev 0) +++ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/init.rb 2009-09-12 11:50:33 UTC (rev 89) @@ -0,0 +1,11 @@ +require 'redmine' + +Redmine::Plugin.register :redmine_rest do + name 'Redmine Rest plugin' + author 'Tony Chemit' + description 'A plugin to expose projects in REST' + version '0.0.1' + project_module :rest do + permission :allow_rest, :rest => :allow_rest + end +end Added: maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/lang/en.yml =================================================================== --- maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/lang/en.yml (rev 0) +++ maven-redmine-plugin/trunk/src/main/redmine/redmine_rest/lang/en.yml 2009-09-12 11:50:33 UTC (rev 89) @@ -0,0 +1,2 @@ +# English strings go here +my_label: "My label"