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 #{(a)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"