diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb new file mode 100644 index 0000000..1fb95cd --- /dev/null +++ b/app/controllers/admin/users_controller.rb @@ -0,0 +1,22 @@ +class UsersController < AdminController + + protect 'manage_environment_users', :environment + + def index + @users = environment.users + respond_to do |format| + format.html + format.xml do + render :xml => @users.to_xml( + :skip_types => true, + :only => %w[email login created_at updated_at], + :include => { :person => {:only => %w[name updated_at created_at address birth_date contact_phone identifier lat lng] } } + ) + end + format.csv do + render :template => "users/index_csv.rhtml", :content_type => 'text/csv', :layout => false + end + end + end + +end diff --git a/app/models/environment.rb b/app/models/environment.rb index a994676..45538fd 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -3,6 +3,8 @@ # domains. class Environment < ActiveRecord::Base + has_many :users + self.partial_updates = false has_many :tasks, :dependent => :destroy, :as => 'target' @@ -14,6 +16,7 @@ class Environment < ActiveRecord::Base 'manage_environment_categories' => N_('Manage environment categories'), 'manage_environment_roles' => N_('Manage environment roles'), 'manage_environment_validators' => N_('Manage environment validators'), + 'manage_environment_users' => N_('Manage environment users'), } module Roles diff --git a/app/views/users/_user_csv.rhtml b/app/views/users/_user_csv.rhtml new file mode 100644 index 0000000..4c52a09 --- /dev/null +++ b/app/views/users/_user_csv.rhtml @@ -0,0 +1 @@ +<%= user_csv.name %>;<%= user_csv.email %> diff --git a/app/views/users/index.rhtml b/app/views/users/index.rhtml new file mode 100644 index 0000000..a4f649a --- /dev/null +++ b/app/views/users/index.rhtml @@ -0,0 +1 @@ +<%= _('Not implemented yet!') %> diff --git a/app/views/users/index_csv.rhtml b/app/views/users/index_csv.rhtml new file mode 100644 index 0000000..b956088 --- /dev/null +++ b/app/views/users/index_csv.rhtml @@ -0,0 +1,2 @@ +<%= _('name') %>;<%= _('email') %> +<%= render :partial => 'user_csv', :collection => @users %> diff --git a/config/routes.rb b/config/routes.rb index dc62086..ea89e05 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -93,6 +93,7 @@ ActionController::Routing::Routes.draw do |map| ###################################################### # administrative tasks for a environment map.admin 'admin', :controller => 'admin_panel' + map.admin 'admin/:controller.:format/:action/:id', :controller => Noosfero.pattern_for_controllers_in_directory('admin') map.admin 'admin/:controller/:action/:id', :controller => Noosfero.pattern_for_controllers_in_directory('admin') diff --git a/features/export_users.feature b/features/export_users.feature new file mode 100644 index 0000000..443999b --- /dev/null +++ b/features/export_users.feature @@ -0,0 +1,29 @@ +Feature: export users + As an administrator + I want to export user from my environment + + Background: + Given the following user + | login | + | ultraje | + + Scenario: Manage users not implemented yet + Given I am logged in as admin + When I go to /admin/users + Then I should see "Not implemented yet!" + + Scenario: Export users as XML + Given I am logged in as admin + When I go to /admin/users.xml + Then I should see "ultraje" + + Scenario: Export users as CSV + Given I am logged in as admin + When I go to /admin/users.csv + Then I should see "name;email" + And I should see "ultraje" + + Scenario: Cant access as normal user + Given I am logged in as "ultraje" + When I go to /admin/users + Then I should see "Access denied" diff --git a/test/factories.rb b/test/factories.rb index 87f56d0..5a08bad 100644 --- a/test/factories.rb +++ b/test/factories.rb @@ -56,7 +56,7 @@ module Noosfero::Factory ###### old stuff to be rearranged def create_admin_user(env) admin_user = User.find_by_login('adminuser') || create_user('adminuser', :email => 'adminuser@noosfero.org', :password => 'adminuser', :password_confirmation => 'adminuser', :environment => env) - admin_role = Role.find_by_name('admin_role') || Role.create!(:name => 'admin_role', :permissions => ['view_environment_admin_panel','edit_environment_features', 'edit_environment_design', 'manage_environment_categories', 'manage_environment_roles', 'manage_environment_validators']) + admin_role = Role.find_by_name('admin_role') || Role.create!(:name => 'admin_role', :permissions => ['view_environment_admin_panel','edit_environment_features', 'edit_environment_design', 'manage_environment_categories', 'manage_environment_roles', 'manage_environment_validators', 'manage_environment_users']) RoleAssignment.create!(:accessor => admin_user.person, :role => admin_role, :resource => env) unless admin_user.person.role_assignments.map{|ra|[ra.role, ra.accessor, ra.resource]}.include?([admin_role, admin_user, env]) admin_user.login end diff --git a/test/fixtures/roles.yml b/test/fixtures/roles.yml index 4fcdeb9..f8d7cc7 100644 --- a/test/fixtures/roles.yml +++ b/test/fixtures/roles.yml @@ -33,6 +33,7 @@ four: - manage_environment_validators - moderate_comments - perform_task + - manage_environment_users profile_admin: id: 5 environment_id: 1 @@ -84,3 +85,4 @@ environment_administrator: - manage_environment_roles - manage_environment_validators - moderate_comments + - manage_environment_users diff --git a/test/functional/users_controller_test.rb b/test/functional/users_controller_test.rb new file mode 100644 index 0000000..1680e18 --- /dev/null +++ b/test/functional/users_controller_test.rb @@ -0,0 +1,46 @@ +require File.dirname(__FILE__) + '/../test_helper' +require 'users_controller' + +# Re-raise errors caught by the controller. +class UsersController; def rescue_action(e) raise e end; end + +class UsersControllerTest < Test::Unit::TestCase + + all_fixtures + def setup + @controller = UsersController.new + @request = ActionController::TestRequest.new + @request.stubs(:ssl?).returns(true) + @response = ActionController::TestResponse.new + end + + should 'not access without right permission' do + get :index + assert_response 403 # forbidden + end + + should 'grant access with right permission' do + admin_user = create_user_with_permission('admin_user', 'manage_environment_users', Environment.default) + login_as('admin_user') + + get :index + assert_response :success + end + + should 'response as XML to export users' do + admin_user = create_user_with_permission('admin_user', 'manage_environment_users', Environment.default) + login_as('admin_user') + + get :index, :format => 'xml' + assert_equal 'application/xml', @response.content_type + end + + should 'response as CSV to export users' do + admin_user = create_user_with_permission('admin_user', 'manage_environment_users', Environment.default) + login_as('admin_user') + + get :index, :format => 'csv' + assert_equal 'text/csv', @response.content_type + end + +end diff --git a/test/unit/environment_test.rb b/test/unit/environment_test.rb index df7e435..aecc31c 100644 --- a/test/unit/environment_test.rb +++ b/test/unit/environment_test.rb @@ -993,4 +993,16 @@ class EnvironmentTest < Test::Unit::TestCase assert_equal 'another', env.theme end + should 'has many users' do + user_from_other_environment = create_user('one user from other env', :environment => Environment.default) + env = fast_create(Environment) + user_from_this_environment1 = create_user('one user', :environment => env) + user_from_this_environment2 = create_user('another user', :environment => env) + user_from_this_environment3 = create_user('some other user', :environment => env) + assert_includes env.users, user_from_this_environment1 + assert_includes env.users, user_from_this_environment2 + assert_includes env.users, user_from_this_environment3 + assert_not_includes env.users, user_from_other_environment + end + end -- libgit2 0.21.2