Commit 7e2ac70a9d5e6130e2d61fe0547e95535383a42b
1 parent
e32dafb8
Exists in
staging
and in
42 other branches
Add driven_signup plugin
Showing
18 changed files
with
268 additions
and
0 deletions
Show diff stats
plugins/driven_signup/controllers/admin/driven_signup_plugin/admin_controller.rb
0 → 100644
@@ -0,0 +1,26 @@ | @@ -0,0 +1,26 @@ | ||
1 | +class DrivenSignupPlugin::AdminController < AdminController | ||
2 | + | ||
3 | + no_design_blocks | ||
4 | + | ||
5 | + protect 'edit_environment_features', :environment | ||
6 | + | ||
7 | + def index | ||
8 | + | ||
9 | + end | ||
10 | + | ||
11 | + def new | ||
12 | + @auth = environment.driven_signup_auths.build | ||
13 | + end | ||
14 | + | ||
15 | + def edit | ||
16 | + @auth = environment.driven_signup_auths.where(id: params[:id]).first | ||
17 | + @auth ||= environment.driven_signup_auths.build | ||
18 | + @auth.update_attributes params[:auth] | ||
19 | + end | ||
20 | + | ||
21 | + def destroy | ||
22 | + @auth = environment.driven_signup_auths.where(token: params[:token]).first | ||
23 | + @auth.destroy if @auth | ||
24 | + end | ||
25 | + | ||
26 | +end |
plugins/driven_signup/controllers/driven_signup_plugin_admin_controller.rb
0 → 100644
@@ -0,0 +1 @@ | @@ -0,0 +1 @@ | ||
1 | +DrivenSignupPluginAdminController = DrivenSignupPlugin::AdminController |
plugins/driven_signup/controllers/public/driven_signup_plugin/account_controller.rb
0 → 100644
@@ -0,0 +1,33 @@ | @@ -0,0 +1,33 @@ | ||
1 | +class DrivenSignupPlugin::AccountController < PublicController | ||
2 | + | ||
3 | + def signup | ||
4 | + return render_access_denied unless Rails.env.development? or request.post? | ||
5 | + return render_access_denied unless self.environment.driven_signup_auths.where(token: params[:token]).first | ||
6 | + | ||
7 | + session[:driven_signup] = true | ||
8 | + session[:base_organization] = params[:base_organization] | ||
9 | + session[:find_suborganization] = params[:find_suborganization] | ||
10 | + session[:suborganization_members_limit] = params[:suborganization_members_limit] | ||
11 | + session[:user_template] = params[:user_template] | ||
12 | + | ||
13 | + user_attributes = [:login, :email] | ||
14 | + user_params = params[:signup].slice *user_attributes | ||
15 | + profile_params = params[:signup].except *user_attributes | ||
16 | + | ||
17 | + if current_user and user_params[:email].squish == current_user.email | ||
18 | + current_user.driven_signup_complete | ||
19 | + redirect_to session.delete(:after_signup_redirect_to) | ||
20 | + else | ||
21 | + self.current_user = nil | ||
22 | + redirect_to controller: :account, action: :signup, user: user_params, profile_data: profile_params | ||
23 | + end | ||
24 | + end | ||
25 | + | ||
26 | + protected | ||
27 | + | ||
28 | + def default_url_options | ||
29 | + # avoid rails' use_relative_controller! | ||
30 | + {use_route: '/'} | ||
31 | + end | ||
32 | + | ||
33 | +end |
plugins/driven_signup/db/migrate/20150625143118_create_driven_signup_plugin_token.rb
0 → 100644
@@ -0,0 +1,16 @@ | @@ -0,0 +1,16 @@ | ||
1 | +class CreateDrivenSignupPluginToken < ActiveRecord::Migration | ||
2 | + | ||
3 | + def change | ||
4 | + create_table :driven_signup_plugin_auths do |t| | ||
5 | + t.integer :environment_id | ||
6 | + t.string :name | ||
7 | + t.string :token | ||
8 | + | ||
9 | + t.timestamps | ||
10 | + end | ||
11 | + add_index :driven_signup_plugin_auths, :environment_id | ||
12 | + add_index :driven_signup_plugin_auths, :token | ||
13 | + add_index :driven_signup_plugin_auths, [:environment_id, :token] | ||
14 | + end | ||
15 | + | ||
16 | +end |
@@ -0,0 +1,46 @@ | @@ -0,0 +1,46 @@ | ||
1 | +require_dependency 'user' | ||
2 | + | ||
3 | +class User | ||
4 | + | ||
5 | + after_create :driven_signup_complete | ||
6 | + | ||
7 | + protected | ||
8 | + | ||
9 | + def driven_signup_complete | ||
10 | + return unless self.session and self.session.delete(:driven_signup) | ||
11 | + | ||
12 | + base_organization = self.environment.profiles.where(identifier: self.session.delete(:base_organization)).first | ||
13 | + return unless base_organization | ||
14 | + organization = base_organization | ||
15 | + | ||
16 | + if self.session.delete :find_suborganization | ||
17 | + members_limit = self.session.delete(:suborganization_members_limit).to_i || 50 | ||
18 | + suborganizations = self.environment.profiles. | ||
19 | + where('identifier <> ?', base_organization.identifier). | ||
20 | + where('identifier LIKE ?', "#{base_organization.identifier}%"). | ||
21 | + order('identifier ASC') | ||
22 | + pp suborganizations | ||
23 | + suborganizations.each do |suborganization| | ||
24 | + if suborganization.members.count < members_limit | ||
25 | + organization = suborganization | ||
26 | + break | ||
27 | + end | ||
28 | + end | ||
29 | + end | ||
30 | + | ||
31 | + if template = self.environment.profiles.where(identifier: self.session.delete(:user_template)).first | ||
32 | + self.person.articles.destroy_all | ||
33 | + self.person.apply_template template | ||
34 | + end | ||
35 | + | ||
36 | + # directly affiliate | ||
37 | + organization.affiliate self.person, Profile::Roles.member(self.environment.id) | ||
38 | + | ||
39 | + self.person.redirection_after_login = 'custom_url' | ||
40 | + self.person.custom_url_redirection = Noosfero::Application.routes.url_for organization.url | ||
41 | + self.person.save | ||
42 | + | ||
43 | + self.session[:after_signup_redirect_to] = organization.url | ||
44 | + end | ||
45 | + | ||
46 | +end |
plugins/driven_signup/models/driven_signup_plugin/auth.rb
0 → 100644
@@ -0,0 +1,15 @@ | @@ -0,0 +1,15 @@ | ||
1 | +class DrivenSignupPlugin::Auth < ActiveRecord::Base | ||
2 | + | ||
3 | + attr_accessible :name, :token | ||
4 | + | ||
5 | + belongs_to :environment | ||
6 | + | ||
7 | + validates_presence_of :environment | ||
8 | + validates_presence_of :token | ||
9 | + validates_uniqueness_of :token, scope: :environment_id | ||
10 | + | ||
11 | + def token | ||
12 | + self[:token] ||= SecureRandom.hex 16 | ||
13 | + end | ||
14 | + | ||
15 | +end |
plugins/driven_signup/public/javascripts/driven_signup.js
0 → 100644
@@ -0,0 +1,22 @@ | @@ -0,0 +1,22 @@ | ||
1 | +driven_signup = { | ||
2 | + | ||
3 | + admin: { | ||
4 | + append: function(auth) { | ||
5 | + return $('#auth-new').before(auth) | ||
6 | + }, | ||
7 | + | ||
8 | + find: function(token) { | ||
9 | + return $('#driven-signup-tokens [data-token='+token+']') | ||
10 | + }, | ||
11 | + | ||
12 | + update: function(token, auth){ | ||
13 | + return this.find(token).replaceWith(auth) | ||
14 | + }, | ||
15 | + | ||
16 | + remove: function(token) { | ||
17 | + return this.find(token).remove() | ||
18 | + }, | ||
19 | + }, | ||
20 | + | ||
21 | +} | ||
22 | + |
plugins/driven_signup/public/stylesheets/driven_signup.scss
0 → 100644
plugins/driven_signup/test/functional/account_controller_test.rb
0 → 100644
@@ -0,0 +1,45 @@ | @@ -0,0 +1,45 @@ | ||
1 | +require 'test_helper' | ||
2 | + | ||
3 | +# Re-raise errors caught by the controller. | ||
4 | +class AccountController; def rescue_action(e) raise e end; end | ||
5 | + | ||
6 | +class AccountControllerTest < ActionController::TestCase | ||
7 | + | ||
8 | + def setup | ||
9 | + @controller = AccountController.new | ||
10 | + @request = ActionController::TestRequest.new | ||
11 | + @response = ActionController::TestResponse.new | ||
12 | + | ||
13 | + e = Environment.default | ||
14 | + e.enable 'skip_new_user_email_confirmation', true | ||
15 | + disable_signup_bot_check e | ||
16 | + end | ||
17 | + | ||
18 | + should 'use the parameters' do | ||
19 | + community = create Community, name: 'base', identifier: 'base1' | ||
20 | + subcommunity = create Community, name: 'sub', identifier: 'base11' | ||
21 | + subcommunity.reload | ||
22 | + | ||
23 | + # simulate DrivenSignupPlugin::AccountController | ||
24 | + session[:driven_signup] = true | ||
25 | + session[:base_organization] = community.identifier | ||
26 | + session[:find_suborganization] = true | ||
27 | + session[:suborganization_members_limit] = 50 | ||
28 | + | ||
29 | + post :signup, user: {login: 'quire', password: 'quire', password_confirmation: 'quire', name: 'quire', email: 'test@example.com'} | ||
30 | + assert_response :redirect | ||
31 | + assert_redirected_to subcommunity.url | ||
32 | + | ||
33 | + user = Profile['quire'] | ||
34 | + assert user | ||
35 | + assert_includes subcommunity.members, user | ||
36 | + end | ||
37 | + | ||
38 | + private | ||
39 | + | ||
40 | + def disable_signup_bot_check environment = Environment.default | ||
41 | + environment.min_signup_delay = 0 | ||
42 | + environment.save! | ||
43 | + end | ||
44 | + | ||
45 | +end |
plugins/driven_signup/views/driven_signup_plugin/account/signup.html.slim
0 → 100644
plugins/driven_signup/views/driven_signup_plugin/admin/_auth.html.slim
0 → 100644
@@ -0,0 +1,10 @@ | @@ -0,0 +1,10 @@ | ||
1 | +div.row | ||
2 | + = form_for auth, as: :auth, remote: true, url: {action: :edit, id: auth.id}, | ||
3 | + html: {data: {token: auth.token}} do |f| | ||
4 | + | ||
5 | + span.cell= f.text_field :name, placeholder: _('name this token') | ||
6 | + span.cell= f.text_field :token, value: auth.token | ||
7 | + span.cell= f.submit nil, class: 'btn btn-default btn-success' | ||
8 | + span.cell= link_to _('Remove'), {action: :destroy, token: auth.token}, remote: true, | ||
9 | + class: 'btn btn-default btn-danger', confirm: _('Are you sure you want to delete this authorization?') | ||
10 | + |
plugins/driven_signup/views/driven_signup_plugin/admin/destroy.js.erb
0 → 100644
plugins/driven_signup/views/driven_signup_plugin/admin/edit.js.erb
0 → 100644
plugins/driven_signup/views/driven_signup_plugin/admin/index.html.slim
0 → 100644
@@ -0,0 +1,11 @@ | @@ -0,0 +1,11 @@ | ||
1 | += content_for :head do | ||
2 | + = stylesheet_link_tag 'plugins/driven_signup/stylesheets/driven_signup' | ||
3 | + = javascript_include_tag 'plugins/driven_signup/javascripts/driven_signup' | ||
4 | + | ||
5 | +div#driven-signup-tokens.table | ||
6 | + - environment.driven_signup_auths.each do |auth| | ||
7 | + = render 'auth', auth: auth | ||
8 | + | ||
9 | + div.row id="auth-new" | ||
10 | + td= link_to _('New'), {action: :new}, remote: true, class: 'btn btn-default fa-add' | ||
11 | + |
plugins/driven_signup/views/driven_signup_plugin/admin/new.js.erb
0 → 100644