Commit 0b4c072dea87683a324665144be219848dabaa00

Authored by Rodrigo Souto
1 parent 24b37d9a

[stoa] Signup Complement

   * Checking wheather the user has cpf to decide what confirmation
     field to show (cpf of birth date)
plugins/stoa/controllers/stoa_plugin_controller.rb
@@ -32,4 +32,12 @@ class StoaPluginController < PublicController @@ -32,4 +32,12 @@ class StoaPluginController < PublicController
32 end 32 end
33 end 33 end
34 34
  35 + def check_cpf
  36 + begin
  37 + render :text => { :exists => !StoaPlugin::UspUser.find_by_codpes(params[:usp_id]).cpf.blank? }.to_json
  38 + rescue Exception => exception
  39 + render :text => { :exists => false, :error => {:message => exception.to_s, :backtrace => exception.backtrace} }.to_json
  40 + end
  41 + end
  42 +
35 end 43 end
plugins/stoa/lib/stoa_plugin.rb
@@ -20,37 +20,16 @@ class StoaPlugin < Noosfero::Plugin @@ -20,37 +20,16 @@ class StoaPlugin < Noosfero::Plugin
20 def signup_extra_contents 20 def signup_extra_contents
21 lambda { 21 lambda {
22 required(labelled_form_field(_('USP number'), text_field_tag('profile_data[usp_id]', '', :id => 'usp_id_field'))) + 22 required(labelled_form_field(_('USP number'), text_field_tag('profile_data[usp_id]', '', :id => 'usp_id_field'))) +
23 - labelled_form_field(_('Select a confirmation data'), select_tag('confirmation_field',  
24 - options_for_select([['CPF','cpf'], [_('Birth date (yyyy-mm-dd)'), 'birth_date']])  
25 - )) +  
26 - required(labelled_form_field(_('Confirmation value'), text_field_tag('confirmation_value', '', :placeholder=>_('Confirmation value')))) +  
27 - javascript_tag(<<-EOF  
28 - jQuery("#usp_id_field").change(function(){  
29 - var me=this;  
30 - jQuery(this).addClass('checking').removeClass('validated');  
31 - jQuery.getJSON('#{url_for(:controller => 'stoa_plugin', :action => 'check_usp_id')}?usp_id='+this.value,  
32 - function(data){  
33 - if(data.exists) jQuery(me).removeClass('checking').addClass('validated');  
34 - else jQuery(me).removeClass('checking').addClass('invalid');  
35 - if(data.error) displayValidationUspIdError(data.error);  
36 - }  
37 - );  
38 - });  
39 -  
40 - function displayValidationUspIdError(error){  
41 - jQuery.colorbox({html: '<h2>'+error.message+'</h2>'+error.backtrace.join("<br />"),  
42 - height: "80%",  
43 - width: "70%" });  
44 - }  
45 - EOF  
46 - ) 23 + content_tag('div', required(labelled_form_field(_('Birth date (yyyy-mm-dd)'), text_field_tag('birth_date', ''))), :id => 'signup-birth-date', :style => 'display: none') +
  24 + content_tag('div', required(labelled_form_field(_('CPF'), text_field_tag('cpf', ''))), :id => 'signup-cpf', :style => 'display:none') +
  25 + javascript_include_tag('../plugins/stoa/javascripts/jquery.observe_field', '../plugins/stoa/javascripts/signup_complement')
47 } 26 }
48 end 27 end
49 28
50 def account_controller_filters 29 def account_controller_filters
51 block = lambda do 30 block = lambda do
52 if request.post? 31 if request.post?
53 - if !StoaPlugin::UspUser.matches?(params[:profile_data][:usp_id], params[:confirmation_field], params[:confirmation_value]) 32 + if !StoaPlugin::UspUser.matches?(params[:profile_data][:usp_id], params[:confirmation_field], params[params[:confirmation_field]])
54 @person = Person.new 33 @person = Person.new
55 @person.errors.add(:usp_id, _(' validation failed')) 34 @person.errors.add(:usp_id, _(' validation failed'))
56 render :action => :signup 35 render :action => :signup
plugins/stoa/public/images/grey-bg.png 0 → 100644

187 Bytes

plugins/stoa/public/javascripts/jquery.observe_field.js 0 → 100644
@@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
  1 +// jquery.observe_field.js
  2 +
  3 +
  4 +(function( $ ){
  5 +
  6 + jQuery.fn.observe_field = function(frequency, callback) {
  7 +
  8 + frequency = frequency * 1000; // translate to milliseconds
  9 +
  10 + return this.each(function(){
  11 + var $this = $(this);
  12 + var prev = $this.val();
  13 +
  14 + var check = function() {
  15 + var val = $this.val();
  16 + if(prev != val){
  17 + prev = val;
  18 + $this.map(callback); // invokes the callback on $this
  19 + }
  20 + };
  21 +
  22 + var reset = function() {
  23 + if(ti){
  24 + clearInterval(ti);
  25 + ti = setInterval(check, frequency);
  26 + }
  27 + };
  28 +
  29 + check();
  30 + var ti = setInterval(check, frequency); // invoke check periodically
  31 +
  32 + // reset counter after user interaction
  33 + $this.bind('keyup click mousemove', reset); //mousemove is for selects
  34 + });
  35 +
  36 + };
  37 +
  38 +})( jQuery );
  39 +
plugins/stoa/public/javascripts/signup_complement.js 0 → 100644
@@ -0,0 +1,41 @@ @@ -0,0 +1,41 @@
  1 +jQuery("#usp_id_field").observe_field(1, function(){
  2 + var me=this;
  3 + jQuery(this).addClass('checking').removeClass('validated');
  4 + jQuery.getJSON('/plugin/stoa/check_usp_id?usp_id='+me.value,
  5 + function(data){
  6 + if(data.exists) {
  7 + jQuery.getJSON('/plugin/stoa/check_cpf?usp_id='+me.value,
  8 + function(data){
  9 + if(data.exists){
  10 + jQuery('#signup-birth-date').hide();
  11 + jQuery('#signup-cpf').show();
  12 + jQuery('#confirmation_field').remove();
  13 + jQuery('#signup-form').append('<input id="confirmation_field" type="hidden" value="cpf" name="confirmation_field">')
  14 + }
  15 + else {
  16 + jQuery('#signup-cpf').hide();
  17 + jQuery('#signup-birth-date').show();
  18 + jQuery('#confirmation_field').remove();
  19 + jQuery('#signup-form').append('<input id="confirmation_field" type="hidden" value="birth_date" name="confirmation_field">')
  20 + }
  21 + jQuery('#signup-form .submit').attr('disabled', false);
  22 + jQuery(me).removeClass('checking').addClass('validated');
  23 + });
  24 + }
  25 + else {
  26 + jQuery('#signup-form .submit').attr('disabled', true);
  27 + jQuery('#signup-birth-date').hide();
  28 + jQuery('#signup-cpf').hide();
  29 + jQuery(me).removeClass('checking').addClass('invalid');
  30 + }
  31 + if(data.error) displayValidationUspIdError(data.error);
  32 + }
  33 +);
  34 +});
  35 +
  36 +function displayValidationUspIdError(error){
  37 + jQuery.colorbox({html: '<h2>'+error.message+'</h2>'+error.backtrace.join("<br />"),
  38 + height: "80%",
  39 + width: "70%" });
  40 +}
  41 +
plugins/stoa/public/style.css
1 #signup-form label[for="usp_id_field"], 1 #signup-form label[for="usp_id_field"],
2 -#signup-form label[for="confirmation_field"] { 2 +#signup-form label[for="cpf"],
  3 +#signup-form label[for="birth_date"] {
3 display: block; 4 display: block;
4 } 5 }
5 6
  7 +#content #signup-form input.submit[disabled=""] {
  8 + background-image: url(/plugins/stoa/images/grey-bg.png);
  9 + text-shadow: 0 -1px 0 #686156;
  10 + cursor: default;
  11 +}
  12 +
plugins/stoa/test/functional/account_controller_test.rb
@@ -6,26 +6,35 @@ class AccountController; def rescue_action(e) raise e end; end @@ -6,26 +6,35 @@ class AccountController; def rescue_action(e) raise e end; end
6 6
7 class AccountControllerTest < ActionController::TestCase 7 class AccountControllerTest < ActionController::TestCase
8 8
  9 + SALT=YAML::load(File.open(StoaPlugin.root_path + '/config.yml'))['salt']
  10 +
9 def setup 11 def setup
10 @controller = AccountController.new 12 @controller = AccountController.new
11 @request = ActionController::TestRequest.new 13 @request = ActionController::TestRequest.new
12 @response = ActionController::TestResponse.new 14 @response = ActionController::TestResponse.new
13 - environment = Environment.default  
14 - environment.enabled_plugins = ['StoaPlugin']  
15 - environment.save!  
16 @db = Tempfile.new('stoa-test') 15 @db = Tempfile.new('stoa-test')
17 configs = ActiveRecord::Base.configurations['stoa'] = {:adapter => 'sqlite3', :database => @db.path} 16 configs = ActiveRecord::Base.configurations['stoa'] = {:adapter => 'sqlite3', :database => @db.path}
  17 + ActiveRecord::Base.establish_connection(:stoa)
  18 + ActiveRecord::Schema.verbose = false
  19 + ActiveRecord::Schema.create_table "pessoa" do |t|
  20 + t.integer "codpes"
  21 + t.text "numcpf"
  22 + t.date "dtanas"
  23 + end
  24 + ActiveRecord::Base.establish_connection(:test)
  25 + StoaPlugin::UspUser.create!(:codpes => 12345678, :cpf => Digest::MD5.hexdigest(SALT+'12345678'), :birth_date => '1970-01-30')
  26 + Environment.default.enable_plugin(StoaPlugin.name)
18 end 27 end
19 28
20 should 'fail if confirmation value doesn\'t match' do 29 should 'fail if confirmation value doesn\'t match' do
21 - StoaPlugin::UspUser.stubs(:matches?).returns(false)  
22 - post :signup, :profile_data => {:usp_id => '87654321'}, :confirmation_field => 'cpf', :confirmation_value => '00000000' 30 + #StoaPlugin::UspUser.stubs(:matches?).returns(false)
  31 + post :signup, :profile_data => {:usp_id => '12345678'}, :confirmation_field => 'cpf', :cpf => '00000000'
23 assert_not_nil assigns(:person).errors[:usp_id] 32 assert_not_nil assigns(:person).errors[:usp_id]
24 end 33 end
25 34
26 should 'pass if confirmation value matches' do 35 should 'pass if confirmation value matches' do
27 - StoaPlugin::UspUser.stubs(:matches?).returns(true)  
28 - post :signup, :profile_data => {:usp_id => '87654321'}, :confirmation_field => 'cpf', :confirmation_value => '12345678' 36 + #StoaPlugin::UspUser.stubs(:matches?).returns(true)
  37 + post :signup, :profile_data => {:usp_id => '12345678'}, :confirmation_field => 'cpf', :cpf => '12345678'
29 assert_nil assigns(:person).errors[:usp_id] 38 assert_nil assigns(:person).errors[:usp_id]
30 end 39 end
31 40
plugins/stoa/test/functional/stoa_plugin_controller_test.rb
@@ -6,16 +6,25 @@ class StoaPluginController; def rescue_action(e) raise e end; end @@ -6,16 +6,25 @@ class StoaPluginController; def rescue_action(e) raise e end; end
6 6
7 class StoaPluginControllerTest < ActionController::TestCase 7 class StoaPluginControllerTest < ActionController::TestCase
8 8
  9 + SALT=YAML::load(File.open(StoaPlugin.root_path + '/config.yml'))['salt']
  10 +
9 def setup 11 def setup
10 @controller = StoaPluginController.new 12 @controller = StoaPluginController.new
11 @request = ActionController::TestRequest.new 13 @request = ActionController::TestRequest.new
12 @response = ActionController::TestResponse.new 14 @response = ActionController::TestResponse.new
13 - @user = create_user('real_user', :password => '123456', :password_confirmation => '123456')  
14 - environment = Environment.default  
15 - environment.enabled_plugins = ['StoaPlugin']  
16 - environment.save!  
17 @db = Tempfile.new('stoa-test') 15 @db = Tempfile.new('stoa-test')
18 configs = ActiveRecord::Base.configurations['stoa'] = {:adapter => 'sqlite3', :database => @db.path} 16 configs = ActiveRecord::Base.configurations['stoa'] = {:adapter => 'sqlite3', :database => @db.path}
  17 + ActiveRecord::Base.establish_connection(:stoa)
  18 + ActiveRecord::Schema.verbose = false
  19 + ActiveRecord::Schema.create_table "pessoa" do |t|
  20 + t.integer "codpes"
  21 + t.text "numcpf"
  22 + t.date "dtanas"
  23 + end
  24 + ActiveRecord::Base.establish_connection(:test)
  25 + @user = User.find_by_login('real_user') || create_user('real_user', :password => '123456', :password_confirmation => '123456')
  26 + StoaPlugin::UspUser.create!(:codpes => 12345678, :cpf => Digest::MD5.hexdigest(SALT+'12345678'), :birth_date => '1970-01-30')
  27 + Environment.default.enable_plugin(StoaPlugin.name)
19 end 28 end
20 29
21 attr_accessor :user 30 attr_accessor :user
@@ -52,18 +61,27 @@ class StoaPluginControllerTest &lt; ActionController::TestCase @@ -52,18 +61,27 @@ class StoaPluginControllerTest &lt; ActionController::TestCase
52 assert_equal user.login, json_response['username'] 61 assert_equal user.login, json_response['username']
53 end 62 end
54 63
  64 + should 'check valid usp id' do
  65 + get :check_usp_id, :usp_id => '12345678'
  66 + assert json_response['exists']
  67 + end
  68 +
55 should 'check invalid usp id' do 69 should 'check invalid usp id' do
56 - StoaPlugin::UspUser.stubs(:exists?).returns(false)  
57 - get :check_usp_id, :usp_id => '987654321' 70 + get :check_usp_id, :usp_id => '87654321'
58 assert !json_response['exists'] 71 assert !json_response['exists']
59 end 72 end
60 73
61 - should 'check valid usp id' do  
62 - StoaPlugin::UspUser.stubs(:exists?).returns(true)  
63 - get :check_usp_id, :usp_id => '987654321' 74 + should 'check existent cpf' do
  75 + get :check_cpf, :usp_id => '12345678'
64 assert json_response['exists'] 76 assert json_response['exists']
65 end 77 end
66 78
  79 + should 'check not existent cpf' do
  80 + StoaPlugin::UspUser.create(:codpes => 87654321, :birth_date => '1970-01-30')
  81 + get :check_cpf, :usp_id => '87654321'
  82 + assert !json_response['exists']
  83 + end
  84 +
67 private 85 private
68 86
69 def json_response 87 def json_response