Commit 6cc3ecdd6fbaae11c211ea69e7929b683bf35509
Exists in
master
and in
29 other branches
Merge commit 'refs/merge-requests/410' of git://gitorious.org/noosfero/noosfero …
…into merge-requests/410
Showing
16 changed files
with
347 additions
and
19 deletions
Show diff stats
app/controllers/admin/users_controller.rb
| @@ -4,12 +4,62 @@ class UsersController < AdminController | @@ -4,12 +4,62 @@ class UsersController < AdminController | ||
| 4 | 4 | ||
| 5 | protect 'manage_environment_users', :environment | 5 | protect 'manage_environment_users', :environment |
| 6 | 6 | ||
| 7 | + include UsersHelper | ||
| 8 | + | ||
| 9 | + def per_page | ||
| 10 | + 10 | ||
| 11 | + end | ||
| 12 | + | ||
| 7 | def index | 13 | def index |
| 14 | + @filter = params[:filter] | ||
| 15 | + if @filter.blank? || @filter == 'all_users' | ||
| 16 | + @filter = 'all_users' | ||
| 17 | + scope = environment.people.no_templates(environment) | ||
| 18 | + elsif @filter == 'admin_users' | ||
| 19 | + scope = environment.people.no_templates(environment).admins | ||
| 20 | + elsif @filter == 'activated_users' | ||
| 21 | + scope = environment.people.no_templates(environment).activated | ||
| 22 | + elsif @filter == 'deactivated_users' | ||
| 23 | + scope = environment.people.no_templates(environment).deactivated | ||
| 24 | + end | ||
| 25 | + @q = params[:q] | ||
| 26 | + if @q.blank? | ||
| 27 | + @collection = scope.paginate(:per_page => per_page, :page => params[:npage]) | ||
| 28 | + else | ||
| 29 | + @collection = find_by_contents(:people, scope, @q, {:per_page => per_page, :page => params[:npage]})[:results] | ||
| 30 | + end | ||
| 31 | + end | ||
| 32 | + | ||
| 33 | + def set_admin_role | ||
| 34 | + person = environment.people.find(params[:id]) | ||
| 35 | + environment.add_admin(person) | ||
| 36 | + redirect_to :action => :index, :q => params[:q], :filter => params[:filter] | ||
| 37 | + end | ||
| 38 | + | ||
| 39 | + def reset_admin_role | ||
| 40 | + person = environment.people.find(params[:id]) | ||
| 41 | + environment.remove_admin(person) | ||
| 42 | + redirect_to :action => :index, :q => params[:q], :filter => params[:filter] | ||
| 43 | + end | ||
| 44 | + | ||
| 45 | + def activate | ||
| 46 | + person = environment.people.find(params[:id]) | ||
| 47 | + person.user.activate | ||
| 48 | + redirect_to :action => :index, :q => params[:q], :filter => params[:filter] | ||
| 49 | + end | ||
| 50 | + | ||
| 51 | + def deactivate | ||
| 52 | + person = environment.people.find(params[:id]) | ||
| 53 | + person.user.deactivate | ||
| 54 | + redirect_to :action => :index, :q => params[:q], :filter => params[:filter] | ||
| 55 | + end | ||
| 56 | + | ||
| 57 | + def download | ||
| 8 | respond_to do |format| | 58 | respond_to do |format| |
| 9 | format.html | 59 | format.html |
| 10 | format.xml do | 60 | format.xml do |
| 11 | - @users = User.find(:all, :conditions => {:environment_id => environment.id}, :include => [:person]) | ||
| 12 | - send_data @users.to_xml( | 61 | + users = User.find(:all, :conditions => {:environment_id => environment.id}, :include => [:person]) |
| 62 | + send_data users.to_xml( | ||
| 13 | :skip_types => true, | 63 | :skip_types => true, |
| 14 | :only => %w[email login created_at updated_at], | 64 | :only => %w[email login created_at updated_at], |
| 15 | :include => { :person => {:only => %w[name updated_at created_at address birth_date contact_phone identifier lat lng] } }), | 65 | :include => { :person => {:only => %w[name updated_at created_at address birth_date contact_phone identifier lat lng] } }), |
app/controllers/application_controller.rb
| @@ -79,7 +79,7 @@ class ApplicationController < ActionController::Base | @@ -79,7 +79,7 @@ class ApplicationController < ActionController::Base | ||
| 79 | 79 | ||
| 80 | helper_method :current_person, :current_person | 80 | helper_method :current_person, :current_person |
| 81 | 81 | ||
| 82 | - protected | 82 | + # protected |
| 83 | 83 | ||
| 84 | def setup_multitenancy | 84 | def setup_multitenancy |
| 85 | Noosfero::MultiTenancy.setup!(request.host) | 85 | Noosfero::MultiTenancy.setup!(request.host) |
| @@ -0,0 +1,25 @@ | @@ -0,0 +1,25 @@ | ||
| 1 | +module UsersHelper | ||
| 2 | + | ||
| 3 | + FILTER_TRANSLATION = { | ||
| 4 | + 'all_users' => _('All users'), | ||
| 5 | + 'admin_users' => _('Admin users'), | ||
| 6 | + 'activated_users' => _('Activated users'), | ||
| 7 | + 'deactivated_users' => _('Deativated users'), | ||
| 8 | + } | ||
| 9 | + | ||
| 10 | + def filter_selector(filter, float = 'right') | ||
| 11 | + options = options_for_select(FILTER_TRANSLATION.map {|key, name| [name, key]}, :selected => filter) | ||
| 12 | + url_params = url_for(params.merge(:filter => 'FILTER')) | ||
| 13 | + onchange = "document.location.href = '#{url_params}'.replace('FILTER', this.value)" | ||
| 14 | + select_field = select_tag(:filter, options, :onchange => onchange) | ||
| 15 | + content_tag('div', | ||
| 16 | + content_tag('strong', _('Filter')) + ': ' + select_field, | ||
| 17 | + :class => "environment-users-customize-search" | ||
| 18 | + ) | ||
| 19 | + end | ||
| 20 | + | ||
| 21 | + def filter_title(filter) | ||
| 22 | + FILTER_TRANSLATION[filter] | ||
| 23 | + end | ||
| 24 | + | ||
| 25 | +end |
app/models/person.rb
| @@ -75,6 +75,10 @@ class Person < Profile | @@ -75,6 +75,10 @@ class Person < Profile | ||
| 75 | named_scope :abusers, :joins => :abuse_complaints, :conditions => ['tasks.status = 3'], :select => 'DISTINCT profiles.*' | 75 | named_scope :abusers, :joins => :abuse_complaints, :conditions => ['tasks.status = 3'], :select => 'DISTINCT profiles.*' |
| 76 | named_scope :non_abusers, :joins => "LEFT JOIN tasks ON profiles.id = tasks.requestor_id AND tasks.type='AbuseComplaint'", :conditions => ["tasks.status != 3 OR tasks.id is NULL"], :select => "DISTINCT profiles.*" | 76 | named_scope :non_abusers, :joins => "LEFT JOIN tasks ON profiles.id = tasks.requestor_id AND tasks.type='AbuseComplaint'", :conditions => ["tasks.status != 3 OR tasks.id is NULL"], :select => "DISTINCT profiles.*" |
| 77 | 77 | ||
| 78 | + named_scope :admins, :joins => [:role_assignments => :role], :conditions => ['roles.key = ?', 'environment_administrator' ] | ||
| 79 | + named_scope :activated, :joins => :user, :conditions => ['users.activation_code IS NULL AND users.activated_at IS NOT NULL'] | ||
| 80 | + named_scope :deactivated, :joins => :user, :conditions => ['NOT (users.activation_code IS NULL AND users.activated_at IS NOT NULL)'] | ||
| 81 | + | ||
| 78 | after_destroy do |person| | 82 | after_destroy do |person| |
| 79 | Friendship.find(:all, :conditions => { :friend_id => person.id}).each { |friendship| friendship.destroy } | 83 | Friendship.find(:all, :conditions => { :friend_id => person.id}).each { |friendship| friendship.destroy } |
| 80 | end | 84 | end |
app/models/profile.rb
| @@ -79,6 +79,7 @@ class Profile < ActiveRecord::Base | @@ -79,6 +79,7 @@ class Profile < ActiveRecord::Base | ||
| 79 | named_scope :enterprises, lambda { {:conditions => (Enterprise.send(:subclasses).map(&:name) << 'Enterprise').map { |klass| "profiles.type = '#{klass}'"}.join(" OR ")} } | 79 | named_scope :enterprises, lambda { {:conditions => (Enterprise.send(:subclasses).map(&:name) << 'Enterprise').map { |klass| "profiles.type = '#{klass}'"}.join(" OR ")} } |
| 80 | named_scope :communities, lambda { {:conditions => (Community.send(:subclasses).map(&:name) << 'Community').map { |klass| "profiles.type = '#{klass}'"}.join(" OR ")} } | 80 | named_scope :communities, lambda { {:conditions => (Community.send(:subclasses).map(&:name) << 'Community').map { |klass| "profiles.type = '#{klass}'"}.join(" OR ")} } |
| 81 | named_scope :templates, lambda { |environment| { :conditions => {:is_template => true, :environment_id => environment.id} } } | 81 | named_scope :templates, lambda { |environment| { :conditions => {:is_template => true, :environment_id => environment.id} } } |
| 82 | + named_scope :no_templates, lambda { |environment| { :conditions => {:is_template => false, :environment_id => environment.id} } } | ||
| 82 | 83 | ||
| 83 | def members | 84 | def members |
| 84 | scopes = plugins.dispatch_scopes(:organization_members, self) | 85 | scopes = plugins.dispatch_scopes(:organization_members, self) |
app/models/user.rb
| @@ -143,6 +143,21 @@ class User < ActiveRecord::Base | @@ -143,6 +143,21 @@ class User < ActiveRecord::Base | ||
| 143 | end | 143 | end |
| 144 | end | 144 | end |
| 145 | 145 | ||
| 146 | + # Deactivates the user in the database. | ||
| 147 | + def deactivate | ||
| 148 | + return false unless self.person | ||
| 149 | + self.activated_at = nil | ||
| 150 | + self.person.visible = false | ||
| 151 | + begin | ||
| 152 | + self.person.save! && self.save! | ||
| 153 | + rescue Exception => exception | ||
| 154 | + logger.error(exception.to_s) | ||
| 155 | + false | ||
| 156 | + else | ||
| 157 | + true | ||
| 158 | + end | ||
| 159 | + end | ||
| 160 | + | ||
| 146 | def activated? | 161 | def activated? |
| 147 | self.activation_code.nil? && !self.activated_at.nil? | 162 | self.activation_code.nil? && !self.activated_at.nil? |
| 148 | end | 163 | end |
| @@ -0,0 +1,6 @@ | @@ -0,0 +1,6 @@ | ||
| 1 | +<% button_bar do %> | ||
| 2 | + <%= button :'text-plain', _('User list as [CSV]'), :action => :download, :format => 'csv' %> | ||
| 3 | + <%= button :'text-html', _('User list as [XML]'), :action => :download, :format => 'xml' %> | ||
| 4 | + <%= button :send, _('Send e-mail to all users'), :action => 'send_mail' %> | ||
| 5 | + <%= button :back, _('Back'), :controller => 'admin_panel' %> | ||
| 6 | +<% end %> |
| @@ -0,0 +1,33 @@ | @@ -0,0 +1,33 @@ | ||
| 1 | +<div class="environment-users-results-header"> | ||
| 2 | + <div id='environment-users-filter-title'><%= filter_title(@filter) %></div> | ||
| 3 | + <%= filter_selector(@filter) %> | ||
| 4 | + <div style="clear: both"></div> | ||
| 5 | +</div> | ||
| 6 | + | ||
| 7 | +<table> | ||
| 8 | + <tr> | ||
| 9 | + <th><%= _('Member') %></th> | ||
| 10 | + <th><%= _('Actions') %></th> | ||
| 11 | + </tr> | ||
| 12 | + <% @collection.each do |p| %> | ||
| 13 | + <tr title="<%= p.name %>"> | ||
| 14 | + <td><%= link_to_profile p.short_name, p.identifier, :title => p.name %> </td> | ||
| 15 | + <td> | ||
| 16 | + <div class="members-buttons-cell"> | ||
| 17 | + <% if p.is_admin? %> | ||
| 18 | + <%= button_without_text :'reset-admin-role', _('Reset admin role'), :action => 'reset_admin_role', :id => p, :q => @q, :filter => @filter %> | ||
| 19 | + <% else %> | ||
| 20 | + <%= button_without_text :'set-admin-role', _('Set admin role'), :action => 'set_admin_role', :id => p, :q => @q, :filter => @filter %> | ||
| 21 | + <% end %> | ||
| 22 | + <% if !p.user.activated? %> | ||
| 23 | + <%= button_without_text :'activate-user', _('Activate user'), :action => 'activate', :id => p, :q => @q, :filter => @filter %> | ||
| 24 | + <% else %> | ||
| 25 | + <%= button_without_text :'deactivate-user', _('Deactivate user'), :action => 'deactivate', :id => p, :q => @q, :filter => @filter %> | ||
| 26 | + <% end %> | ||
| 27 | + </div> | ||
| 28 | + </td> | ||
| 29 | + </tr> | ||
| 30 | + <% end %> | ||
| 31 | +</table> | ||
| 32 | + | ||
| 33 | +<%= pagination_links @collection, {:param_name => 'npage', :page_links => true} %> |
app/views/users/index.rhtml
| 1 | <h1><%= _('Manage users') %></h1> | 1 | <h1><%= _('Manage users') %></h1> |
| 2 | 2 | ||
| 3 | -<ul> | ||
| 4 | - <li> | ||
| 5 | - <%= _('Download users list') %>: | ||
| 6 | - <%= link_to '[CSV]', :format => 'csv' %> | ||
| 7 | - <%= link_to '[XML]', :format => 'xml' %> | ||
| 8 | - </li> | ||
| 9 | - <li> | ||
| 10 | - <%= link_to _('Send e-mail to users'), :action => 'send_mail' %> | ||
| 11 | - </li> | ||
| 12 | -</ul> | ||
| 13 | - | ||
| 14 | -<% button_bar do %> | ||
| 15 | - <%= button :back, _('Back to admin panel'), :controller => 'admin_panel' %> | 3 | +<% form_tag( { :action => 'index' }, :method => 'get', :class => 'users-search' ) do %> |
| 4 | +<div id="search-users"> | ||
| 5 | + <%= render :partial => 'users_search_form' %> | ||
| 6 | +</div> | ||
| 7 | +<div id="users-list"> | ||
| 8 | + <%= render :partial => 'users_list' %> | ||
| 9 | +</div> | ||
| 16 | <% end %> | 10 | <% end %> |
| 11 | + | ||
| 12 | +<%= render :partial => 'index_buttons' %> | ||
| 17 | \ No newline at end of file | 13 | \ No newline at end of file |
public/designs/icons/tango/style.css
| @@ -100,6 +100,11 @@ | @@ -100,6 +100,11 @@ | ||
| 100 | .icon-user-unknown { background-image: url(Tango/16x16/status/dialog-error.png) } | 100 | .icon-user-unknown { background-image: url(Tango/16x16/status/dialog-error.png) } |
| 101 | .icon-alert { background-image: url(Tango/16x16/status/dialog-warning.png) } | 101 | .icon-alert { background-image: url(Tango/16x16/status/dialog-warning.png) } |
| 102 | 102 | ||
| 103 | +.icon-activate-user { background-image: url(Tango/16x16/emblems/emblem-system.png) } | ||
| 104 | +.icon-deactivate-user { background-image: url(Tango/16x16/emblems/emblem-unreadable.png) } | ||
| 105 | +.icon-set-admin-role { background-image: url(mod/16x16/apps/user.png) } | ||
| 106 | +.icon-reset-admin-role { background-image: url(/images/icons-app/person-icon.png) } | ||
| 107 | + | ||
| 103 | /******************LARGE ICONS********************/ | 108 | /******************LARGE ICONS********************/ |
| 104 | .image-gallery-item .folder { background-image: url(mod/96x96/places/folder.png) } | 109 | .image-gallery-item .folder { background-image: url(mod/96x96/places/folder.png) } |
| 105 | .image-gallery-item .gallery { background-image: url(mod/96x96/mimetypes/image-x-generic.png) } | 110 | .image-gallery-item .gallery { background-image: url(mod/96x96/mimetypes/image-x-generic.png) } |
public/stylesheets/application.css
| @@ -4179,6 +4179,33 @@ h1#agenda-title { | @@ -4179,6 +4179,33 @@ h1#agenda-title { | ||
| 4179 | -webkit-border-radius:10px; | 4179 | -webkit-border-radius:10px; |
| 4180 | } | 4180 | } |
| 4181 | 4181 | ||
| 4182 | +/* ==> public/stylesheets/controller_environment_users.css <== */ | ||
| 4183 | +.controller-environment_users table { | ||
| 4184 | + text-align: left; | ||
| 4185 | +} | ||
| 4186 | + | ||
| 4187 | +#environment-users-search form { | ||
| 4188 | + padding: 10px; | ||
| 4189 | + margin-bottom: 15px; | ||
| 4190 | + background-color: #E6E6E6; | ||
| 4191 | + -moz-border-radius: 5px; | ||
| 4192 | + -webkit-border-radius: 5px; | ||
| 4193 | +} | ||
| 4194 | + | ||
| 4195 | +.environment-users-results-header { | ||
| 4196 | + font-size: 0.9em; | ||
| 4197 | + padding: 6px 0px 0px 0px; | ||
| 4198 | + margin:0 0 5px 0; | ||
| 4199 | + border-bottom: 2px dotted #999; | ||
| 4200 | + text-align: right; | ||
| 4201 | +} | ||
| 4202 | +#environment-users-filter-title { | ||
| 4203 | + font-weight: bold; | ||
| 4204 | + font-size: 130%; | ||
| 4205 | + line-height: 35px; | ||
| 4206 | + float: left; | ||
| 4207 | +} | ||
| 4208 | + | ||
| 4182 | /* * * Profile search * * * * * * * */ | 4209 | /* * * Profile search * * * * * * * */ |
| 4183 | 4210 | ||
| 4184 | #public-profile-search, #profile-search-results form, .profile-search-block form { | 4211 | #public-profile-search, #profile-search-results form, .profile-search-block form { |
test/functional/users_controller_test.rb
| @@ -6,11 +6,16 @@ class UsersController; def rescue_action(e) raise e end; end | @@ -6,11 +6,16 @@ class UsersController; def rescue_action(e) raise e end; end | ||
| 6 | 6 | ||
| 7 | class UsersControllerTest < ActionController::TestCase | 7 | class UsersControllerTest < ActionController::TestCase |
| 8 | 8 | ||
| 9 | - all_fixtures | ||
| 10 | def setup | 9 | def setup |
| 11 | @controller = UsersController.new | 10 | @controller = UsersController.new |
| 12 | @request = ActionController::TestRequest.new | 11 | @request = ActionController::TestRequest.new |
| 13 | @response = ActionController::TestResponse.new | 12 | @response = ActionController::TestResponse.new |
| 13 | + | ||
| 14 | + | ||
| 15 | + Environment.delete_all | ||
| 16 | + Environment.create(:name => 'some env', :is_default => true) | ||
| 17 | + admin_user = create_user_with_permission('adminuser', 'manage_environment_users', Environment.default) | ||
| 18 | + login_as('adminuser') | ||
| 14 | end | 19 | end |
| 15 | 20 | ||
| 16 | should 'not access without right permission' do | 21 | should 'not access without right permission' do |
| @@ -28,11 +33,83 @@ class UsersControllerTest < ActionController::TestCase | @@ -28,11 +33,83 @@ class UsersControllerTest < ActionController::TestCase | ||
| 28 | assert_response :success | 33 | assert_response :success |
| 29 | end | 34 | end |
| 30 | 35 | ||
| 36 | + should 'blank search results include activated and deactivated users' do | ||
| 37 | + deactivated = create_user('deactivated') | ||
| 38 | + deactivated.activated_at = nil | ||
| 39 | + deactivated.person.visible = false | ||
| 40 | + deactivated.save! | ||
| 41 | + get :index, :q => '' | ||
| 42 | + assert_tag :tag => 'div', :attributes => { :id => /users-list/ }, :descendant => {:tag => 'a', :attributes => {:title => /adminuser/}} | ||
| 43 | + assert_tag :tag => 'div', :attributes => { :id => /users-list/ }, :descendant => {:tag => 'a', :attributes => {:title => /deactivated/}} | ||
| 44 | + end | ||
| 45 | + | ||
| 46 | + should 'blank search include all users' do | ||
| 47 | + (1..5).each {|i| | ||
| 48 | + u = create_user('user'+i.to_s) | ||
| 49 | + } | ||
| 50 | + get :index, :q => '' # blank search | ||
| 51 | + assert_tag :tag => 'div', :attributes => { :id => /users-list/ }, :descendant => {:tag => 'a', :attributes => {:title => /adminuser/}} | ||
| 52 | + (1..5).each {|i| | ||
| 53 | + u = 'user'+i.to_s | ||
| 54 | + assert_tag :tag => 'div', :attributes => { :id => /users-list/ }, :descendant => {:tag => 'a', :attributes => {:title => u}} | ||
| 55 | + } | ||
| 56 | + end | ||
| 57 | + | ||
| 58 | + should 'search not include all users' do | ||
| 59 | + (1..5).each {|i| | ||
| 60 | + u = create_user('user'+i.to_s) | ||
| 61 | + } | ||
| 62 | + get :index, :q => 'er5' # search | ||
| 63 | + assert_tag :tag => 'div', :attributes => { :id => /users-list/ }, :descendant => {:tag => 'a', :attributes => {:title => /user5/}} | ||
| 64 | + (1..4).each {|i| | ||
| 65 | + u = 'user'+i.to_s | ||
| 66 | + assert_no_tag :tag => 'div', :attributes => { :id => /users-list/ }, :descendant => {:tag => 'a', :attributes => {:title => u}} | ||
| 67 | + } | ||
| 68 | + end | ||
| 69 | + | ||
| 70 | + should 'set admin role' do | ||
| 71 | + u = create_user() | ||
| 72 | + assert_equal false, u.person.is_admin? | ||
| 73 | + post :set_admin_role, :id => u.person.id, :q => '' | ||
| 74 | + u.reload | ||
| 75 | + assert u.person.is_admin? | ||
| 76 | + end | ||
| 77 | + | ||
| 78 | + should 'reset admin role' do | ||
| 79 | + u = create_user() | ||
| 80 | + e = Environment.default | ||
| 81 | + e.add_admin(u.person) | ||
| 82 | + u.reload | ||
| 83 | + assert u.person.is_admin? | ||
| 84 | + post :reset_admin_role, :id => u.person.id, :q => '' | ||
| 85 | + u.reload | ||
| 86 | + assert_equal false, u.person.is_admin? | ||
| 87 | + end | ||
| 88 | + | ||
| 89 | + should 'activate user' do | ||
| 90 | + u = create_user() | ||
| 91 | + assert_equal false, u.activated? | ||
| 92 | + post :activate, :id => u.person.id, :q => '' | ||
| 93 | + u.reload | ||
| 94 | + assert u.activated? | ||
| 95 | + end | ||
| 96 | + | ||
| 97 | + should 'deactivate user' do | ||
| 98 | + u = create_user() | ||
| 99 | + u.activated_at = Time.now.utc | ||
| 100 | + u.activation_code = nil | ||
| 101 | + u.person.visible = true | ||
| 102 | + assert u.activated? | ||
| 103 | + post :deactivate, :id => u.person.id, :q => '' | ||
| 104 | + u.reload | ||
| 105 | + assert_equal false, u.activated? | ||
| 106 | + end | ||
| 107 | + | ||
| 31 | should 'response as XML to export users' do | 108 | should 'response as XML to export users' do |
| 32 | admin_user = create_user_with_permission('admin_user', 'manage_environment_users', Environment.default) | 109 | admin_user = create_user_with_permission('admin_user', 'manage_environment_users', Environment.default) |
| 33 | login_as('admin_user') | 110 | login_as('admin_user') |
| 34 | 111 | ||
| 35 | - get :index, :format => 'xml' | 112 | + get :download, :format => 'xml' |
| 36 | assert_equal 'text/xml', @response.content_type | 113 | assert_equal 'text/xml', @response.content_type |
| 37 | end | 114 | end |
| 38 | 115 | ||
| @@ -40,7 +117,7 @@ class UsersControllerTest < ActionController::TestCase | @@ -40,7 +117,7 @@ class UsersControllerTest < ActionController::TestCase | ||
| 40 | admin_user = create_user_with_permission('admin_user', 'manage_environment_users', Environment.default) | 117 | admin_user = create_user_with_permission('admin_user', 'manage_environment_users', Environment.default) |
| 41 | login_as('admin_user') | 118 | login_as('admin_user') |
| 42 | 119 | ||
| 43 | - get :index, :format => 'csv' | 120 | + get :download, :format => 'csv' |
| 44 | assert_equal 'text/csv', @response.content_type | 121 | assert_equal 'text/csv', @response.content_type |
| 45 | assert_equal 'name;email', @response.body.split("\n")[0] | 122 | assert_equal 'name;email', @response.body.split("\n")[0] |
| 46 | end | 123 | end |
test/unit/person_test.rb
| @@ -1335,4 +1335,56 @@ class PersonTest < ActiveSupport::TestCase | @@ -1335,4 +1335,56 @@ class PersonTest < ActiveSupport::TestCase | ||
| 1335 | assert_includes non_abusers, not_abuser | 1335 | assert_includes non_abusers, not_abuser |
| 1336 | end | 1336 | end |
| 1337 | 1337 | ||
| 1338 | + should 'admins named_scope return persons who are admin users' do | ||
| 1339 | + Person.delete_all | ||
| 1340 | + e = Environment.default | ||
| 1341 | + admins = [] | ||
| 1342 | + (1..5).each {|i| | ||
| 1343 | + u = create_user('user'+i.to_s) | ||
| 1344 | + e.add_admin(u.person) | ||
| 1345 | + admins << u.person | ||
| 1346 | + } | ||
| 1347 | + (6..10).each {|i| | ||
| 1348 | + u = create_user('user'+i.to_s) | ||
| 1349 | + } | ||
| 1350 | + assert_equal admins, Person.admins | ||
| 1351 | + end | ||
| 1352 | + | ||
| 1353 | + should 'activated named_scope return persons who are activated users' do | ||
| 1354 | + Person.delete_all | ||
| 1355 | + e = Environment.default | ||
| 1356 | + activated = [] | ||
| 1357 | + (1..5).each {|i| | ||
| 1358 | + u = create_user('user'+i.to_s) | ||
| 1359 | + u.activated_at = Time.now.utc | ||
| 1360 | + u.activation_code = nil | ||
| 1361 | + u.save! | ||
| 1362 | + activated << u.person | ||
| 1363 | + } | ||
| 1364 | + (6..10).each {|i| | ||
| 1365 | + u = create_user('user'+i.to_s) | ||
| 1366 | + u.activated_at = nil | ||
| 1367 | + u.save! | ||
| 1368 | + } | ||
| 1369 | + assert_equal activated, Person.activated | ||
| 1370 | + end | ||
| 1371 | + | ||
| 1372 | + should 'deactivated named_scope return persons who are deactivated users' do | ||
| 1373 | + Person.delete_all | ||
| 1374 | + e = Environment.default | ||
| 1375 | + deactivated = [] | ||
| 1376 | + (1..5).each {|i| | ||
| 1377 | + u = create_user('user'+i.to_s) | ||
| 1378 | + u.activated_at = nil | ||
| 1379 | + u.save! | ||
| 1380 | + deactivated << u.person | ||
| 1381 | + } | ||
| 1382 | + (6..10).each {|i| | ||
| 1383 | + u = create_user('user'+i.to_s) | ||
| 1384 | + u.activated_at = Time.now.utc | ||
| 1385 | + u.activation_code = nil | ||
| 1386 | + u.save! | ||
| 1387 | + } | ||
| 1388 | + assert_equal deactivated, Person.deactivated | ||
| 1389 | + end | ||
| 1338 | end | 1390 | end |
test/unit/profile_test.rb
| @@ -1379,6 +1379,18 @@ class ProfileTest < ActiveSupport::TestCase | @@ -1379,6 +1379,18 @@ class ProfileTest < ActiveSupport::TestCase | ||
| 1379 | assert_not_includes Profile.templates(Environment.default), profile | 1379 | assert_not_includes Profile.templates(Environment.default), profile |
| 1380 | end | 1380 | end |
| 1381 | 1381 | ||
| 1382 | + should 'return a list of profiles that are not templates' do | ||
| 1383 | + p1 = fast_create(Profile, :is_template => false) | ||
| 1384 | + p2 = fast_create(Profile, :is_template => false) | ||
| 1385 | + t1 = fast_create(Profile, :is_template => true) | ||
| 1386 | + t2 = fast_create(Profile, :is_template => true) | ||
| 1387 | + | ||
| 1388 | + assert_includes Profile.no_templates(Environment.default), p1 | ||
| 1389 | + assert_includes Profile.no_templates(Environment.default), p2 | ||
| 1390 | + assert_not_includes Profile.no_templates(Environment.default), t1 | ||
| 1391 | + assert_not_includes Profile.no_templates(Environment.default), t2 | ||
| 1392 | + end | ||
| 1393 | + | ||
| 1382 | should 'not crash on a profile update with a destroyed template' do | 1394 | should 'not crash on a profile update with a destroyed template' do |
| 1383 | template = fast_create(Profile, :is_template => true) | 1395 | template = fast_create(Profile, :is_template => true) |
| 1384 | profile = fast_create(Profile, :template_id => template.id) | 1396 | profile = fast_create(Profile, :template_id => template.id) |
test/unit/user_test.rb
| @@ -518,6 +518,25 @@ class UserTest < ActiveSupport::TestCase | @@ -518,6 +518,25 @@ class UserTest < ActiveSupport::TestCase | ||
| 518 | end | 518 | end |
| 519 | end | 519 | end |
| 520 | 520 | ||
| 521 | + should 'deactivate an user' do | ||
| 522 | + user = new_user | ||
| 523 | + user.activated_at = Time.now.utc | ||
| 524 | + user.person.visible = true | ||
| 525 | + assert user.deactivate | ||
| 526 | + assert_nil user.activated_at | ||
| 527 | + assert !user.person.visible | ||
| 528 | + end | ||
| 529 | + | ||
| 530 | + should 'return if the user is deactivated' do | ||
| 531 | + user = new_user | ||
| 532 | + user.activated_at = Time.now.utc | ||
| 533 | + user.activation_code = nil | ||
| 534 | + user.person.visible = true | ||
| 535 | + assert user.activated? | ||
| 536 | + user.deactivate | ||
| 537 | + assert !user.activated? | ||
| 538 | + end | ||
| 539 | + | ||
| 521 | should 'activate right after creation when confirmation is not required' do | 540 | should 'activate right after creation when confirmation is not required' do |
| 522 | e = Environment.default | 541 | e = Environment.default |
| 523 | e.enable('skip_new_user_email_confirmation') | 542 | e.enable('skip_new_user_email_confirmation') |