Commit 1ea734898ee0b66b093bde6469d691215ca2c447

Authored by Arthur Esposte
Committed by Daniela Feitosa
1 parent 5c1641f3

curriculum_lattes_plugin: Refactoring to use load_plugin_filters hotspot

app/controllers/admin/features_controller.rb
... ... @@ -17,10 +17,6 @@ class FeaturesController < AdminController
17 17  
18 18 def manage_fields
19 19 @person_fields = Person.fields
20   - @plugins.dispatch(:extra_person_fields).collect do |field|
21   - @person_fields << field unless @person_fields.include?(field)
22   - end
23   -
24 20 @enterprise_fields = Enterprise.fields
25 21 @community_fields = Community.fields
26 22 end
... ...
app/controllers/my_profile/profile_editor_controller.rb
... ... @@ -16,21 +16,15 @@ class ProfileEditorController &lt; MyProfileController
16 16 if request.post?
17 17 params[:profile_data][:fields_privacy] ||= {} if profile.person? && params[:profile_data].is_a?(Hash)
18 18 begin
19   - @plugins.dispatch(:profile_editor_transaction_extras)
20   -
21 19 Profile.transaction do
22 20 Image.transaction do
23   - if @profile_data.update_attributes(params[:profile_data])
24   - redirect_to :action => 'index', :profile => profile.identifier
25   - else
26   - profile.identifier = params[:profile] if profile.identifier.blank?
27   - end
  21 + @plugins.dispatch(:profile_editor_transaction_extras)
  22 + @profile_data.update_attributes!(params[:profile_data])
  23 + redirect_to :action => 'index', :profile => profile.identifier
28 24 end
29 25 end
30 26 rescue Exception => ex
31   - if profile.identifier.blank?
32   - profile.identifier = params[:profile]
33   - end
  27 + profile.identifier = params[:profile] if profile.identifier.blank?
34 28 end
35 29 end
36 30 end
... ...
app/controllers/public/account_controller.rb
... ... @@ -93,13 +93,7 @@ class AccountController &lt; ApplicationController
93 93 @user.terms_of_use = environment.terms_of_use
94 94 @user.environment = environment
95 95 @terms_of_use = environment.terms_of_use
96   -
97   - params_profile_data = params[:profile_data]
98   - @plugins.dispatch(:extra_person_data_params).each do |data|
99   - params_profile_data = params_profile_data.merge(data) unless params[:profile_data].blank?
100   - end
101   -
102   - @user.person_data = params_profile_data
  96 + @user.person_data = params[:profile_data]
103 97 @user.return_to = session[:return_to]
104 98 @person = Person.new(params[:profile_data])
105 99 @person.environment = @user.environment
... ...
app/models/user.rb
... ... @@ -29,8 +29,6 @@ class User &lt; ActiveRecord::Base
29 29 alias_method_chain :human_attribute_name, :customization
30 30 end
31 31  
32   - include Noosfero::Plugin::HotSpot
33   -
34 32 before_create do |user|
35 33 if user.environment.nil?
36 34 user.environment = Environment.default
... ... @@ -48,7 +46,6 @@ class User &lt; ActiveRecord::Base
48 46 p.environment = user.environment
49 47 p.name ||= user.name || user.login
50 48 p.visible = false unless user.activated?
51   -
52 49 p.save!
53 50  
54 51 user.person = p
... ...
db/schema.rb
1 1 # encoding: UTF-8
2 2 # This file is auto-generated from the current state of the database. Instead
3 3 # of editing this file, please use the migrations feature of Active Record to
  4 +# incrementally modify your database, and then regenerate this schema definition.
4 5 #
5 6 # Note that this schema.rb definition is the authoritative source for your
6 7 # database schema. If you need to create the application database on another
... ...
features/step_definitions/noosfero_steps.rb
... ... @@ -762,3 +762,11 @@ When /^I confirm the &quot;(.*)&quot; dialog$/ do |confirmation|
762 762 assert_equal confirmation, a.text
763 763 a.accept
764 764 end
  765 +
  766 +Given /^the field (.*) is public for all users$/ do |field|
  767 + Person.all.each do |person|
  768 + person.fields_privacy = Hash.new if person.fields_privacy.nil?
  769 + person.fields_privacy[field] = "public"
  770 + person.save!
  771 + end
  772 +end
765 773 \ No newline at end of file
... ...
lib/noosfero/plugin.rb
... ... @@ -537,23 +537,12 @@ class Noosfero::Plugin
537 537 nil
538 538 end
539 539  
540   - # -> Return a list of extra person fields
541   - # returns = a list of strings with fields' name
542   - def extra_person_fields
543   - []
544   - end
545   -
546 540 # -> Return a list of hashs with the needed information to create optional fields
547 541 # returns = a list of hashs as {:name => "string", :label => "string", :object_name => :key, :method => :key}
548 542 def extra_optional_fields
549 543 []
550 544 end
551 545  
552   - # -> Return a hash with another object's params
553   - def extra_person_data_params
554   - {}
555   - end
556   -
557 546 # -> Adds additional blocks to profiles and environments.
558 547 # Your plugin must implements a class method called 'extra_blocks'
559 548 # that returns a hash with the following syntax.
... ...
plugins/lattes_curriculum/README.md 0 → 100644
... ... @@ -0,0 +1,45 @@
  1 +README - Lattes Curriculum (LattesCurriculum Plugin)
  2 +================================
  3 +
  4 +Lattes Curriculum is a plugin that allow users to show their academic informations in the wall, extracted from CNPQ's lattes plataform
  5 +
  6 +INSTALL
  7 +=======
  8 +
  9 +Enable Plugin
  10 +-------------
  11 +
  12 +Also, you need to enable LattesCurriculum Plugin on your Noosfero:
  13 +
  14 +cd <your_noosfero_dir>
  15 +./script/noosfero-plugins enable lattes_curriculum
  16 +
  17 +Active Plugin
  18 +-------------
  19 +
  20 +As a Noosfero administrator user, go to administrator panel:
  21 +
  22 +- Click on "Enable/disable plugins" option
  23 +- Click on "LattesCurriculumPlugin" check-box
  24 +
  25 +Running LattesCurriculum tests
  26 +--------------------
  27 +
  28 +$ rake test:noosfero_plugins:lattes_curriculum
  29 +
  30 +LICENSE
  31 +=======
  32 +
  33 +Copyright (c) The Author developers.
  34 +
  35 +See Noosfero license.
  36 +
  37 +
  38 +AUTHORS
  39 +=======
  40 +
  41 +Jose Pedro (1jpsneto at gmail.com)
  42 +Thiago Kairala (thiagor.kairala at gmail.com)
  43 +Ana Paula Vargas (anapaulavnoronha at gmail.com)
  44 +Leandro Veloso (leandrovelosorodrigues at gmail.com)
  45 +Arthur Del Esposte (arthurmde at gmail.com)
0 46 \ No newline at end of file
... ...
plugins/lattes_curriculum/db/migrate/20140814210103_create_academic_infos.rb
1 1 class CreateAcademicInfos < ActiveRecord::Migration
2 2 def self.up
3   - create_table :academic_infos do |t|
4   - t.references :person
  3 + create_table :academic_infos do |t|
  4 + t.references :person
5 5 t.column :lattes_url, :string
6 6 end
7   - end
  7 + end
8 8  
9 9 def self.down
10 10 drop_table :academic_infos
... ...
plugins/lattes_curriculum/features/lattes_curriculum.feature
... ... @@ -7,55 +7,43 @@ Feature: import lattes information
7 7 Given "LattesCurriculumPlugin" plugin is enabled
8 8 And I am logged in as admin
9 9 And I go to /admin/plugins
10   - And I check "LattesCurriculumPlugin"
  10 + And I check "Lattes Curriculum Plugin"
11 11 And I press "Save changes"
12 12 And I go to /admin/features/manage_fields
13 13 Given I follow "Person's fields"
14 14 And I check "person_fields_lattes_url_active"
15 15 And I check "person_fields_lattes_url_signup"
16 16 And I press "save_person_fields"
17   - And feature "skip_new_user_email_confirmation" is enabled on environment
18   - And I am not logged in
19 17  
20   - @selenium
21   - Scenario: Import lattes informations after singup
22   - Given I am on signup page
23   - When I fill in "e-Mail" with "josesilva@example.com"
24   - And I fill in "Username" with "josesilva"
25   - And I fill in "Full name" with "João Silva"
26   - And I fill in "Password" with "secret"
27   - And I fill in "Password confirmation" with "secret"
  18 + Scenario: Don't accept edit the profile with invalid lattes url
  19 + Given I am on admin_user's control panel
  20 + When I follow "Edit Profile"
  21 + And I fill in "Lattes URL" with "http://youtube.com.br/"
  22 + And I press "Save"
  23 + Then I should see "Academic info lattes url is invalid"
  24 +
  25 + Scenario: Import lattes informations
  26 + Given I am on admin_user's control panel
  27 + And the field lattes_url is public for all users
  28 + When I follow "Edit Profile"
28 29 And I fill in "Lattes URL" with "http://lattes.cnpq.br/2864976228727880"
29   - And wait for the captcha signup time
30   - And I press "Create my account"
31   - And I go to /profile/josesilva
32   - And I follow "Lattes" within "#ui-tabs-anchor"
  30 + And I press "Save"
  31 + And I go to /profile/admin_user#lattes_tab
33 32 Then I should see "Endereço para acessar este CV: http://lattes.cnpq.br/2864976228727880"
34 33  
35   - @selenium
36 34 Scenario: Don't show lattes informations for blank lattes urls
37   - Given I am on signup page
38   - When I fill in "e-Mail" with "josesilva@example.com"
39   - And I fill in "Username" with "josesilva"
40   - And I fill in "Full name" with "João Silva"
41   - And I fill in "Password" with "secret"
42   - And I fill in "Password confirmation" with "secret"
43   - And wait for the captcha signup time
44   - And I press "Create my account"
45   - And I go to /profile/josesilva
46   - Then I should not see "Lattes" within "#ui-tabs-anchor"
  35 + Given I am on admin_user's control panel
  36 + And the field lattes_url is public for all users
  37 + When I follow "Edit Profile"
  38 + And I press "Save"
  39 + And I go to /profile/admin_user
  40 + Then I should not see "Lattes"
47 41  
48   - @selenium
49 42 Scenario: Inform problem if the informed lattes doesn't exist
50   - Given I am on signup page
51   - When I fill in "e-Mail" with "josesilva@example.com"
52   - And I fill in "Username" with "josesilva"
53   - And I fill in "Full name" with "João Silva"
54   - And I fill in "Password" with "secret"
55   - And I fill in "Password confirmation" with "secret"
  43 + Given I am on admin_user's control panel
  44 + And the field lattes_url is public for all users
  45 + When I follow "Edit Profile"
56 46 And I fill in "Lattes URL" with "http://lattes.cnpq.br/123456"
57   - And wait for the captcha signup time
58   - And I press "Create my account"
59   - And I go to /profile/josesilva
60   - And I follow "Lattes" within "#ui-tabs-anchor"
  47 + And I press "Save"
  48 + And I go to /profile/admin_user#lattes_tab
61 49 Then I should see "Lattes not found. Please, make sure the informed URL is correct."
62 50 \ No newline at end of file
... ...
plugins/lattes_curriculum/lib/academic_info.rb
1 1 class AcademicInfo < ActiveRecord::Base
2 2  
3   - belongs_to :person
  3 + belongs_to :person
4 4  
5   - attr_accessible :lattes_url
  5 + attr_accessible :lattes_url
6 6 validate :lattes_url_validate?
7 7  
8 8 def lattes_url_validate?
9   - valid_url_start = 'http://lattes.cnpq.br/'
10   - unless self.lattes_url.blank? || self.lattes_url =~ /http:\/\/lattes.cnpq.br\/\d+/
11   - self.errors.add(:lattes_url, _("Sorry, the lattes url is not valid."))
  9 + unless AcademicInfo.matches?(self.lattes_url)
  10 + self.errors.add(:lattes_url, _(" is invalid."))
12 11 end
13 12 end
  13 +
  14 + def self.matches?(info)
  15 + lattes = nil
  16 + if info.class == String
  17 + lattes = info
  18 + elsif info.class == Hash
  19 + lattes = info[:lattes_url]
  20 + end
  21 + return lattes.blank? || lattes =~ /^http:\/\/lattes.cnpq.br\/\d+$/
  22 + end
14 23 end
... ...
plugins/lattes_curriculum/lib/ext/person.rb
... ... @@ -15,4 +15,6 @@ class Person
15 15 def lattes_url= value
16 16 self.academic_info.lattes_url = value unless self.academic_info.nil?
17 17 end
  18 +
  19 + FIELDS << "lattes_url"
18 20 end
... ...
plugins/lattes_curriculum/lib/html_parser.rb
... ... @@ -6,8 +6,8 @@ Encoding.default_external = Encoding::UTF_8
6 6 Encoding.default_internal = Encoding::UTF_8
7 7  
8 8 class Html_parser
9   - def get_html(lattes_link = "")
10   - begin
  9 + def get_html(lattes_link = "")
  10 + begin
11 11 page = Nokogiri::HTML(open(lattes_link), nil, "UTF-8")
12 12 page = page.css(".main-content").to_s()
13 13 page = remove_class_tooltip(page)
... ... @@ -17,8 +17,10 @@ class Html_parser
17 17 page = remove_further_informations(page)
18 18 rescue OpenURI::HTTPError => e
19 19 page = _("Lattes not found. Please, make sure the informed URL is correct.")
20   - end
21   - end
  20 + rescue Timeout::Error => e
  21 + page = _("Lattes Platform is unreachable. Please, try it later.")
  22 + end
  23 + end
22 24  
23 25 def remove_class_tooltip(page = "")
24 26 while page.include? 'class="tooltip"' do
... ...
plugins/lattes_curriculum/lib/lattes_curriculum_plugin.rb
1 1 class LattesCurriculumPlugin < Noosfero::Plugin
2 2  
3 3 def self.plugin_name
4   - "LattesCurriculumPlugin"
  4 + "Lattes Curriculum Plugin"
5 5 end
6 6  
7 7 def self.plugin_description
... ... @@ -17,10 +17,6 @@ class LattesCurriculumPlugin &lt; Noosfero::Plugin
17 17 end
18 18  
19 19 def extra_optional_fields
20   - if context.profile && context.profile.person? && context.profile.academic_info.nil?
21   - context.profile.academic_info = AcademicInfo.new
22   - end
23   -
24 20 fields = []
25 21  
26 22 lattes_url = {
... ... @@ -36,20 +32,8 @@ class LattesCurriculumPlugin &lt; Noosfero::Plugin
36 32 return fields
37 33 end
38 34  
39   - def extra_person_fields
40   - fields = []
41   -
42   - fields << "lattes_url"
43   -
44   - return fields
45   - end
46   -
47   - def extra_person_data_params
48   - {"academic_info_attributes" => context.params[:academic_infos]}
49   - end
50   -
51 35 def profile_tabs
52   - unless context.profile.academic_info.nil? || context.profile.academic_info.lattes_url.blank?
  36 + if show_lattes_tab?
53 37 href = context.profile.academic_info.lattes_url
54 38 html_parser = Html_parser.new
55 39 {
... ... @@ -69,6 +53,78 @@ class LattesCurriculumPlugin &lt; Noosfero::Plugin
69 53 end
70 54 end
71 55  
  56 + def profile_editor_controller_filters
  57 + validate_lattes_url_block = proc do
  58 + if request.post?
  59 + if !params[:academic_infos].blank?
  60 + @profile_data = profile
  61 +
  62 + academic_infos = {"academic_info_attributes" => params[:academic_infos]}
  63 +
  64 + params_profile_data = params[:profile_data]
  65 + params_profile_data = params_profile_data.merge(academic_infos)
  66 +
  67 + @profile_data.attributes = params_profile_data
  68 + @profile_data.valid?
  69 +
  70 + @possible_domains = profile.possible_domains
  71 +
  72 + unless AcademicInfo.matches?(params[:academic_infos])
  73 + @profile_data.errors.add(:lattes_url, _(' Invalid lattes url'))
  74 + render :action => :edit, :profile => profile.identifier
  75 + end
  76 + end
  77 + end
  78 + end
  79 +
  80 + create_academic_info_block = proc do
  81 + if profile && profile.person? && profile.academic_info.nil?
  82 + profile.academic_info = AcademicInfo.new
  83 + end
  84 + end
  85 +
  86 + [{:type => 'before_filter',
  87 + :method_name => 'validate_lattes_url',
  88 + :options => {:only => 'edit'},
  89 + :block => validate_lattes_url_block },
  90 + {:type => 'before_filter',
  91 + :method_name => 'create_academic_info',
  92 + :options => {:only => 'edit'},
  93 + :block => create_academic_info_block }]
  94 + end
  95 +
  96 + def account_controller_filters
  97 + validate_lattes_url_block = proc do
  98 + if request.post?
  99 + params[:profile_data] ||= {}
  100 + params[:profile_data][:academic_info_attributes] = params[:academic_infos]
  101 +
  102 + if !params[:academic_infos].blank? && !AcademicInfo.matches?(params[:academic_infos])
  103 + @person = Person.new(params[:profile_data])
  104 + @person.environment = environment
  105 + @user = User.new(params[:user])
  106 + @person.errors.add(:lattes_url, _(' Invalid lattes url'))
  107 + render :action => :signup
  108 + end
  109 + end
  110 + end
  111 +
  112 + create_academic_info_block = proc do
  113 + if profile && profile.person? && profile.academic_info.nil?
  114 + profile.academic_info = AcademicInfo.new
  115 + end
  116 + end
  117 +
  118 + [{:type => 'before_filter',
  119 + :method_name => 'validate_lattes_url',
  120 + :options => {:only => 'signup'},
  121 + :block => validate_lattes_url_block },
  122 + {:type => 'before_filter',
  123 + :method_name => 'create_academic_info',
  124 + :options => {:only => 'edit'},
  125 + :block => create_academic_info_block }]
  126 + end
  127 +
72 128 protected
73 129  
74 130 def academic_info_transaction
... ... @@ -77,4 +133,7 @@ class LattesCurriculumPlugin &lt; Noosfero::Plugin
77 133 end
78 134 end
79 135  
  136 + def show_lattes_tab?
  137 + return context.profile.person? && !context.profile.academic_info.nil? && !context.profile.academic_info.lattes_url.blank? && context.profile.public_fields.include?("lattes_url")
  138 + end
80 139 end
... ...
plugins/lattes_curriculum/public/singup_complement.js
1 1 jQuery(function($){
2   - $(document).ready(function(){
3   - $('#lattes_id_field').blur(function(){
4   - var value = this.value
5   - })
  2 + $(document).ready(function(){
  3 + $('#lattes_id_field').blur(function(){
  4 + var value = this.value
  5 + })
6 6  
7   - $('#lattes_id_field').focus(function(){
8   - $('#lattes-id-balloon').fadeIn('slow')
9   - })
  7 + $('#lattes_id_field').focus(function(){
  8 + $('#lattes-id-balloon').fadeIn('slow')
  9 + })
10 10  
11   - $('#lattes_id_field').blur(function(){
12   - $('#lattes-id-balloon').fadeOut('slow')
13   - })
14   - })
  11 + $('#lattes_id_field').blur(function(){
  12 + $('#lattes-id-balloon').fadeOut('slow')
  13 + })
  14 + })
15 15 })
16 16 \ No newline at end of file
... ...
plugins/lattes_curriculum/test/unit/academic_info_test.rb
... ... @@ -20,6 +20,4 @@ class AcademicInfoTest &lt; ActiveSupport::TestCase
20 20 @academic_info.lattes_url = "http://lattes.cnpq.br/2193972715230641"
21 21 assert @academic_info.save
22 22 end
23   -
24   -
25 23 end
... ...
plugins/lattes_curriculum/test/unit/html_parser_test.rb
... ... @@ -21,5 +21,4 @@ class HtmlParserTest &lt; ActiveSupport::TestCase
21 21 should 'inform that lattes was not found' do
22 22 assert_equal "Lattes not found. Please, make sure the informed URL is correct.", @parser.get_html("http://lattes.cnpq.br/123")
23 23 end
24   -
25 24 end
... ...
plugins/lattes_curriculum/test/unit/lattes_curriculum_test.rb
... ... @@ -11,7 +11,7 @@ class LattesCurriculumPluginTest &lt; ActiveSupport::TestCase
11 11 end
12 12  
13 13 should 'have name' do
14   - assert_equal 'LattesCurriculumPlugin', LattesCurriculumPlugin.plugin_name
  14 + assert_equal 'Lattes Curriculum Plugin', LattesCurriculumPlugin.plugin_name
15 15 end
16 16  
17 17 should 'have description' do
... ... @@ -21,5 +21,4 @@ class LattesCurriculumPluginTest &lt; ActiveSupport::TestCase
21 21 should 'have stylesheet' do
22 22 assert @plugin.stylesheet?
23 23 end
24   -
25 24 end
... ...