diff --git a/app/controllers/admin/features_controller.rb b/app/controllers/admin/features_controller.rb index c1b38ce..4bbe006 100644 --- a/app/controllers/admin/features_controller.rb +++ b/app/controllers/admin/features_controller.rb @@ -17,10 +17,6 @@ class FeaturesController < AdminController def manage_fields @person_fields = Person.fields - @plugins.dispatch(:extra_person_fields).collect do |field| - @person_fields << field unless @person_fields.include?(field) - end - @enterprise_fields = Enterprise.fields @community_fields = Community.fields end diff --git a/app/controllers/my_profile/profile_editor_controller.rb b/app/controllers/my_profile/profile_editor_controller.rb index acf12f5..18cb602 100644 --- a/app/controllers/my_profile/profile_editor_controller.rb +++ b/app/controllers/my_profile/profile_editor_controller.rb @@ -16,21 +16,15 @@ class ProfileEditorController < MyProfileController if request.post? params[:profile_data][:fields_privacy] ||= {} if profile.person? && params[:profile_data].is_a?(Hash) begin - @plugins.dispatch(:profile_editor_transaction_extras) - Profile.transaction do Image.transaction do - if @profile_data.update_attributes(params[:profile_data]) - redirect_to :action => 'index', :profile => profile.identifier - else - profile.identifier = params[:profile] if profile.identifier.blank? - end + @plugins.dispatch(:profile_editor_transaction_extras) + @profile_data.update_attributes!(params[:profile_data]) + redirect_to :action => 'index', :profile => profile.identifier end end rescue Exception => ex - if profile.identifier.blank? - profile.identifier = params[:profile] - end + profile.identifier = params[:profile] if profile.identifier.blank? end end end diff --git a/app/controllers/public/account_controller.rb b/app/controllers/public/account_controller.rb index 0a17dde..a7cf41d 100644 --- a/app/controllers/public/account_controller.rb +++ b/app/controllers/public/account_controller.rb @@ -93,13 +93,7 @@ class AccountController < ApplicationController @user.terms_of_use = environment.terms_of_use @user.environment = environment @terms_of_use = environment.terms_of_use - - params_profile_data = params[:profile_data] - @plugins.dispatch(:extra_person_data_params).each do |data| - params_profile_data = params_profile_data.merge(data) unless params[:profile_data].blank? - end - - @user.person_data = params_profile_data + @user.person_data = params[:profile_data] @user.return_to = session[:return_to] @person = Person.new(params[:profile_data]) @person.environment = @user.environment diff --git a/app/models/user.rb b/app/models/user.rb index 694e618..af05e33 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -29,8 +29,6 @@ class User < ActiveRecord::Base alias_method_chain :human_attribute_name, :customization end - include Noosfero::Plugin::HotSpot - before_create do |user| if user.environment.nil? user.environment = Environment.default @@ -48,7 +46,6 @@ class User < ActiveRecord::Base p.environment = user.environment p.name ||= user.name || user.login p.visible = false unless user.activated? - p.save! user.person = p diff --git a/db/schema.rb b/db/schema.rb index 246a128..2d97bfb 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,6 +1,7 @@ # encoding: UTF-8 # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. # # Note that this schema.rb definition is the authoritative source for your # database schema. If you need to create the application database on another diff --git a/features/step_definitions/noosfero_steps.rb b/features/step_definitions/noosfero_steps.rb index 37ee20d..a778105 100644 --- a/features/step_definitions/noosfero_steps.rb +++ b/features/step_definitions/noosfero_steps.rb @@ -762,3 +762,11 @@ When /^I confirm the "(.*)" dialog$/ do |confirmation| assert_equal confirmation, a.text a.accept end + +Given /^the field (.*) is public for all users$/ do |field| + Person.all.each do |person| + person.fields_privacy = Hash.new if person.fields_privacy.nil? + person.fields_privacy[field] = "public" + person.save! + end +end \ No newline at end of file diff --git a/lib/noosfero/plugin.rb b/lib/noosfero/plugin.rb index 68cb9ff..b371385 100644 --- a/lib/noosfero/plugin.rb +++ b/lib/noosfero/plugin.rb @@ -537,23 +537,12 @@ class Noosfero::Plugin nil end - # -> Return a list of extra person fields - # returns = a list of strings with fields' name - def extra_person_fields - [] - end - # -> Return a list of hashs with the needed information to create optional fields # returns = a list of hashs as {:name => "string", :label => "string", :object_name => :key, :method => :key} def extra_optional_fields [] end - # -> Return a hash with another object's params - def extra_person_data_params - {} - end - # -> Adds additional blocks to profiles and environments. # Your plugin must implements a class method called 'extra_blocks' # that returns a hash with the following syntax. diff --git a/plugins/lattes_curriculum/README.md b/plugins/lattes_curriculum/README.md new file mode 100644 index 0000000..4aed1d7 --- /dev/null +++ b/plugins/lattes_curriculum/README.md @@ -0,0 +1,45 @@ +README - Lattes Curriculum (LattesCurriculum Plugin) +================================ + +Lattes Curriculum is a plugin that allow users to show their academic informations in the wall, extracted from CNPQ's lattes plataform + +INSTALL +======= + +Enable Plugin +------------- + +Also, you need to enable LattesCurriculum Plugin on your Noosfero: + +cd +./script/noosfero-plugins enable lattes_curriculum + +Active Plugin +------------- + +As a Noosfero administrator user, go to administrator panel: + +- Click on "Enable/disable plugins" option +- Click on "LattesCurriculumPlugin" check-box + +Running LattesCurriculum tests +-------------------- + +$ rake test:noosfero_plugins:lattes_curriculum + +LICENSE +======= + +Copyright (c) The Author developers. + +See Noosfero license. + + +AUTHORS +======= + +Jose Pedro (1jpsneto at gmail.com) +Thiago Kairala (thiagor.kairala at gmail.com) +Ana Paula Vargas (anapaulavnoronha at gmail.com) +Leandro Veloso (leandrovelosorodrigues at gmail.com) +Arthur Del Esposte (arthurmde at gmail.com) \ No newline at end of file diff --git a/plugins/lattes_curriculum/db/migrate/20140814210103_create_academic_infos.rb b/plugins/lattes_curriculum/db/migrate/20140814210103_create_academic_infos.rb index 050ec88..ab154bc 100644 --- a/plugins/lattes_curriculum/db/migrate/20140814210103_create_academic_infos.rb +++ b/plugins/lattes_curriculum/db/migrate/20140814210103_create_academic_infos.rb @@ -1,10 +1,10 @@ class CreateAcademicInfos < ActiveRecord::Migration def self.up - create_table :academic_infos do |t| - t.references :person + create_table :academic_infos do |t| + t.references :person t.column :lattes_url, :string end - end + end def self.down drop_table :academic_infos diff --git a/plugins/lattes_curriculum/features/lattes_curriculum.feature b/plugins/lattes_curriculum/features/lattes_curriculum.feature index f114cac..e889123 100644 --- a/plugins/lattes_curriculum/features/lattes_curriculum.feature +++ b/plugins/lattes_curriculum/features/lattes_curriculum.feature @@ -7,55 +7,43 @@ Feature: import lattes information Given "LattesCurriculumPlugin" plugin is enabled And I am logged in as admin And I go to /admin/plugins - And I check "LattesCurriculumPlugin" + And I check "Lattes Curriculum Plugin" And I press "Save changes" And I go to /admin/features/manage_fields Given I follow "Person's fields" And I check "person_fields_lattes_url_active" And I check "person_fields_lattes_url_signup" And I press "save_person_fields" - And feature "skip_new_user_email_confirmation" is enabled on environment - And I am not logged in - @selenium - Scenario: Import lattes informations after singup - Given I am on signup page - When I fill in "e-Mail" with "josesilva@example.com" - And I fill in "Username" with "josesilva" - And I fill in "Full name" with "João Silva" - And I fill in "Password" with "secret" - And I fill in "Password confirmation" with "secret" + Scenario: Don't accept edit the profile with invalid lattes url + Given I am on admin_user's control panel + When I follow "Edit Profile" + And I fill in "Lattes URL" with "http://youtube.com.br/" + And I press "Save" + Then I should see "Academic info lattes url is invalid" + + Scenario: Import lattes informations + Given I am on admin_user's control panel + And the field lattes_url is public for all users + When I follow "Edit Profile" And I fill in "Lattes URL" with "http://lattes.cnpq.br/2864976228727880" - And wait for the captcha signup time - And I press "Create my account" - And I go to /profile/josesilva - And I follow "Lattes" within "#ui-tabs-anchor" + And I press "Save" + And I go to /profile/admin_user#lattes_tab Then I should see "Endereço para acessar este CV: http://lattes.cnpq.br/2864976228727880" - @selenium Scenario: Don't show lattes informations for blank lattes urls - Given I am on signup page - When I fill in "e-Mail" with "josesilva@example.com" - And I fill in "Username" with "josesilva" - And I fill in "Full name" with "João Silva" - And I fill in "Password" with "secret" - And I fill in "Password confirmation" with "secret" - And wait for the captcha signup time - And I press "Create my account" - And I go to /profile/josesilva - Then I should not see "Lattes" within "#ui-tabs-anchor" + Given I am on admin_user's control panel + And the field lattes_url is public for all users + When I follow "Edit Profile" + And I press "Save" + And I go to /profile/admin_user + Then I should not see "Lattes" - @selenium Scenario: Inform problem if the informed lattes doesn't exist - Given I am on signup page - When I fill in "e-Mail" with "josesilva@example.com" - And I fill in "Username" with "josesilva" - And I fill in "Full name" with "João Silva" - And I fill in "Password" with "secret" - And I fill in "Password confirmation" with "secret" + Given I am on admin_user's control panel + And the field lattes_url is public for all users + When I follow "Edit Profile" And I fill in "Lattes URL" with "http://lattes.cnpq.br/123456" - And wait for the captcha signup time - And I press "Create my account" - And I go to /profile/josesilva - And I follow "Lattes" within "#ui-tabs-anchor" + And I press "Save" + And I go to /profile/admin_user#lattes_tab Then I should see "Lattes not found. Please, make sure the informed URL is correct." \ No newline at end of file diff --git a/plugins/lattes_curriculum/lib/academic_info.rb b/plugins/lattes_curriculum/lib/academic_info.rb index aa7254d..eeef15f 100644 --- a/plugins/lattes_curriculum/lib/academic_info.rb +++ b/plugins/lattes_curriculum/lib/academic_info.rb @@ -1,14 +1,23 @@ class AcademicInfo < ActiveRecord::Base - belongs_to :person + belongs_to :person - attr_accessible :lattes_url + attr_accessible :lattes_url validate :lattes_url_validate? def lattes_url_validate? - valid_url_start = 'http://lattes.cnpq.br/' - unless self.lattes_url.blank? || self.lattes_url =~ /http:\/\/lattes.cnpq.br\/\d+/ - self.errors.add(:lattes_url, _("Sorry, the lattes url is not valid.")) + unless AcademicInfo.matches?(self.lattes_url) + self.errors.add(:lattes_url, _(" is invalid.")) end end + + def self.matches?(info) + lattes = nil + if info.class == String + lattes = info + elsif info.class == Hash + lattes = info[:lattes_url] + end + return lattes.blank? || lattes =~ /^http:\/\/lattes.cnpq.br\/\d+$/ + end end diff --git a/plugins/lattes_curriculum/lib/ext/person.rb b/plugins/lattes_curriculum/lib/ext/person.rb index 7162332..0d6b565 100755 --- a/plugins/lattes_curriculum/lib/ext/person.rb +++ b/plugins/lattes_curriculum/lib/ext/person.rb @@ -15,4 +15,6 @@ class Person def lattes_url= value self.academic_info.lattes_url = value unless self.academic_info.nil? end + + FIELDS << "lattes_url" end diff --git a/plugins/lattes_curriculum/lib/html_parser.rb b/plugins/lattes_curriculum/lib/html_parser.rb index 057faa4..ef2b043 100755 --- a/plugins/lattes_curriculum/lib/html_parser.rb +++ b/plugins/lattes_curriculum/lib/html_parser.rb @@ -6,8 +6,8 @@ Encoding.default_external = Encoding::UTF_8 Encoding.default_internal = Encoding::UTF_8 class Html_parser - def get_html(lattes_link = "") - begin + def get_html(lattes_link = "") + begin page = Nokogiri::HTML(open(lattes_link), nil, "UTF-8") page = page.css(".main-content").to_s() page = remove_class_tooltip(page) @@ -17,8 +17,10 @@ class Html_parser page = remove_further_informations(page) rescue OpenURI::HTTPError => e page = _("Lattes not found. Please, make sure the informed URL is correct.") - end - end + rescue Timeout::Error => e + page = _("Lattes Platform is unreachable. Please, try it later.") + end + end def remove_class_tooltip(page = "") while page.include? 'class="tooltip"' do diff --git a/plugins/lattes_curriculum/lib/lattes_curriculum_plugin.rb b/plugins/lattes_curriculum/lib/lattes_curriculum_plugin.rb index 19455c1..6bf5cae 100755 --- a/plugins/lattes_curriculum/lib/lattes_curriculum_plugin.rb +++ b/plugins/lattes_curriculum/lib/lattes_curriculum_plugin.rb @@ -1,7 +1,7 @@ class LattesCurriculumPlugin < Noosfero::Plugin def self.plugin_name - "LattesCurriculumPlugin" + "Lattes Curriculum Plugin" end def self.plugin_description @@ -17,10 +17,6 @@ class LattesCurriculumPlugin < Noosfero::Plugin end def extra_optional_fields - if context.profile && context.profile.person? && context.profile.academic_info.nil? - context.profile.academic_info = AcademicInfo.new - end - fields = [] lattes_url = { @@ -36,20 +32,8 @@ class LattesCurriculumPlugin < Noosfero::Plugin return fields end - def extra_person_fields - fields = [] - - fields << "lattes_url" - - return fields - end - - def extra_person_data_params - {"academic_info_attributes" => context.params[:academic_infos]} - end - def profile_tabs - unless context.profile.academic_info.nil? || context.profile.academic_info.lattes_url.blank? + if show_lattes_tab? href = context.profile.academic_info.lattes_url html_parser = Html_parser.new { @@ -69,6 +53,78 @@ class LattesCurriculumPlugin < Noosfero::Plugin end end + def profile_editor_controller_filters + validate_lattes_url_block = proc do + if request.post? + if !params[:academic_infos].blank? + @profile_data = profile + + academic_infos = {"academic_info_attributes" => params[:academic_infos]} + + params_profile_data = params[:profile_data] + params_profile_data = params_profile_data.merge(academic_infos) + + @profile_data.attributes = params_profile_data + @profile_data.valid? + + @possible_domains = profile.possible_domains + + unless AcademicInfo.matches?(params[:academic_infos]) + @profile_data.errors.add(:lattes_url, _(' Invalid lattes url')) + render :action => :edit, :profile => profile.identifier + end + end + end + end + + create_academic_info_block = proc do + if profile && profile.person? && profile.academic_info.nil? + profile.academic_info = AcademicInfo.new + end + end + + [{:type => 'before_filter', + :method_name => 'validate_lattes_url', + :options => {:only => 'edit'}, + :block => validate_lattes_url_block }, + {:type => 'before_filter', + :method_name => 'create_academic_info', + :options => {:only => 'edit'}, + :block => create_academic_info_block }] + end + + def account_controller_filters + validate_lattes_url_block = proc do + if request.post? + params[:profile_data] ||= {} + params[:profile_data][:academic_info_attributes] = params[:academic_infos] + + if !params[:academic_infos].blank? && !AcademicInfo.matches?(params[:academic_infos]) + @person = Person.new(params[:profile_data]) + @person.environment = environment + @user = User.new(params[:user]) + @person.errors.add(:lattes_url, _(' Invalid lattes url')) + render :action => :signup + end + end + end + + create_academic_info_block = proc do + if profile && profile.person? && profile.academic_info.nil? + profile.academic_info = AcademicInfo.new + end + end + + [{:type => 'before_filter', + :method_name => 'validate_lattes_url', + :options => {:only => 'signup'}, + :block => validate_lattes_url_block }, + {:type => 'before_filter', + :method_name => 'create_academic_info', + :options => {:only => 'edit'}, + :block => create_academic_info_block }] + end + protected def academic_info_transaction @@ -77,4 +133,7 @@ class LattesCurriculumPlugin < Noosfero::Plugin end end + def show_lattes_tab? + return context.profile.person? && !context.profile.academic_info.nil? && !context.profile.academic_info.lattes_url.blank? && context.profile.public_fields.include?("lattes_url") + end end diff --git a/plugins/lattes_curriculum/public/singup_complement.js b/plugins/lattes_curriculum/public/singup_complement.js index 04a0e29..ca6b799 100644 --- a/plugins/lattes_curriculum/public/singup_complement.js +++ b/plugins/lattes_curriculum/public/singup_complement.js @@ -1,15 +1,15 @@ jQuery(function($){ - $(document).ready(function(){ - $('#lattes_id_field').blur(function(){ - var value = this.value - }) + $(document).ready(function(){ + $('#lattes_id_field').blur(function(){ + var value = this.value + }) - $('#lattes_id_field').focus(function(){ - $('#lattes-id-balloon').fadeIn('slow') - }) + $('#lattes_id_field').focus(function(){ + $('#lattes-id-balloon').fadeIn('slow') + }) - $('#lattes_id_field').blur(function(){ - $('#lattes-id-balloon').fadeOut('slow') - }) - }) + $('#lattes_id_field').blur(function(){ + $('#lattes-id-balloon').fadeOut('slow') + }) + }) }) \ No newline at end of file diff --git a/plugins/lattes_curriculum/test/unit/academic_info_test.rb b/plugins/lattes_curriculum/test/unit/academic_info_test.rb index 4186bc4..415feb1 100644 --- a/plugins/lattes_curriculum/test/unit/academic_info_test.rb +++ b/plugins/lattes_curriculum/test/unit/academic_info_test.rb @@ -20,6 +20,4 @@ class AcademicInfoTest < ActiveSupport::TestCase @academic_info.lattes_url = "http://lattes.cnpq.br/2193972715230641" assert @academic_info.save end - - end diff --git a/plugins/lattes_curriculum/test/unit/html_parser_test.rb b/plugins/lattes_curriculum/test/unit/html_parser_test.rb index 9e22267..e175fab 100644 --- a/plugins/lattes_curriculum/test/unit/html_parser_test.rb +++ b/plugins/lattes_curriculum/test/unit/html_parser_test.rb @@ -21,5 +21,4 @@ class HtmlParserTest < ActiveSupport::TestCase should 'inform that lattes was not found' do assert_equal "Lattes not found. Please, make sure the informed URL is correct.", @parser.get_html("http://lattes.cnpq.br/123") end - end diff --git a/plugins/lattes_curriculum/test/unit/lattes_curriculum_test.rb b/plugins/lattes_curriculum/test/unit/lattes_curriculum_test.rb index f6138a6..0610e14 100644 --- a/plugins/lattes_curriculum/test/unit/lattes_curriculum_test.rb +++ b/plugins/lattes_curriculum/test/unit/lattes_curriculum_test.rb @@ -11,7 +11,7 @@ class LattesCurriculumPluginTest < ActiveSupport::TestCase end should 'have name' do - assert_equal 'LattesCurriculumPlugin', LattesCurriculumPlugin.plugin_name + assert_equal 'Lattes Curriculum Plugin', LattesCurriculumPlugin.plugin_name end should 'have description' do @@ -21,5 +21,4 @@ class LattesCurriculumPluginTest < ActiveSupport::TestCase should 'have stylesheet' do assert @plugin.stylesheet? end - end -- libgit2 0.21.2