Commit 1ea734898ee0b66b093bde6469d691215ca2c447
Committed by
Daniela Feitosa
1 parent
5c1641f3
Exists in
master
and in
29 other branches
curriculum_lattes_plugin: Refactoring to use load_plugin_filters hotspot
Showing
18 changed files
with
198 additions
and
118 deletions
Show diff stats
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 < 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 < 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 < 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 < 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 "(.*)" 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. | ... | ... |
... | ... | @@ -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
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 < 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 < 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 < 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 < 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
plugins/lattes_curriculum/test/unit/html_parser_test.rb
plugins/lattes_curriculum/test/unit/lattes_curriculum_test.rb
... | ... | @@ -11,7 +11,7 @@ class LattesCurriculumPluginTest < 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 < ActiveSupport::TestCase |
21 | 21 | should 'have stylesheet' do |
22 | 22 | assert @plugin.stylesheet? |
23 | 23 | end |
24 | - | |
25 | 24 | end | ... | ... |