Commit 7e2ac70a9d5e6130e2d61fe0547e95535383a42b
1 parent
e32dafb8
Exists in
master
and in
9 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 @@ |
| 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 @@ |
| 1 | +DrivenSignupPluginAdminController = DrivenSignupPlugin::AdminController | ... | ... |
plugins/driven_signup/controllers/public/driven_signup_plugin/account_controller.rb
0 → 100644
| ... | ... | @@ -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 @@ |
| 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 @@ |
| 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 @@ |
| 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 @@ |
| 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 @@ |
| 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 @@ |
| 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 @@ |
| 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