diff --git a/app/controllers/admin/features_controller.rb b/app/controllers/admin/features_controller.rb index 4bbe006..c1b38ce 100644 --- a/app/controllers/admin/features_controller.rb +++ b/app/controllers/admin/features_controller.rb @@ -17,6 +17,10 @@ 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 3ee21a3..acf12f5 100644 --- a/app/controllers/my_profile/profile_editor_controller.rb +++ b/app/controllers/my_profile/profile_editor_controller.rb @@ -15,14 +15,22 @@ class ProfileEditorController < MyProfileController @possible_domains = profile.possible_domains if request.post? params[:profile_data][:fields_privacy] ||= {} if profile.person? && params[:profile_data].is_a?(Hash) - 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? + 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 + end + end + rescue Exception => ex + if profile.identifier.blank? + profile.identifier = params[:profile] end - end end end end diff --git a/app/controllers/public/account_controller.rb b/app/controllers/public/account_controller.rb index a7cf41d..0a17dde 100644 --- a/app/controllers/public/account_controller.rb +++ b/app/controllers/public/account_controller.rb @@ -93,7 +93,13 @@ class AccountController < ApplicationController @user.terms_of_use = environment.terms_of_use @user.environment = environment @terms_of_use = environment.terms_of_use - @user.person_data = params[:profile_data] + + 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.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 af05e33..694e618 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -29,6 +29,8 @@ 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 @@ -46,6 +48,7 @@ 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/app/views/profile_editor/_person_form.html.erb b/app/views/profile_editor/_person_form.html.erb index a2bd218..19abfb0 100644 --- a/app/views/profile_editor/_person_form.html.erb +++ b/app/views/profile_editor/_person_form.html.erb @@ -27,6 +27,10 @@ <%= optional_field(@person, 'district', labelled_form_field(_('District'), text_field(:profile_data, :district, :rel => _('District')))) %> <%= optional_field(@person, 'image', labelled_form_field(_('Image'), file_field(:file, :image, :rel => _('Image')))) %> +<% @plugins.dispatch(:extra_optional_fields).each do |field| %> + <%= optional_field(@person, field[:name], labelled_form_field(field[:label], text_field(field[:object_name], field[:method], :rel => field[:label], :value => field[:value]))) %> +<% end %> + <% optional_field(@person, 'schooling') do %>
diff --git a/lib/noosfero/plugin.rb b/lib/noosfero/plugin.rb index acd897e..68cb9ff 100644 --- a/lib/noosfero/plugin.rb +++ b/lib/noosfero/plugin.rb @@ -531,6 +531,29 @@ class Noosfero::Plugin nil end + # -> Perform extra transactions related to profile in profile editor + # returns = true in success or raise and exception if it could not update the data + def profile_editor_transaction_extras + 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/db/migrate/20140415223448_add_url_lattes_to_person.rb b/plugins/lattes_curriculum/db/migrate/20140415223448_add_url_lattes_to_person.rb deleted file mode 100644 index a66f0b0..0000000 --- a/plugins/lattes_curriculum/db/migrate/20140415223448_add_url_lattes_to_person.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddUrlLattesToPerson < ActiveRecord::Migration - def self.up - add_column :profiles, :lattes_url, :string - end - - def self.down - remove_column :profiles, :lattes_url - end -end diff --git a/plugins/lattes_curriculum/db/migrate/20140814210103_create_academic_infos.rb b/plugins/lattes_curriculum/db/migrate/20140814210103_create_academic_infos.rb new file mode 100644 index 0000000..050ec88 --- /dev/null +++ b/plugins/lattes_curriculum/db/migrate/20140814210103_create_academic_infos.rb @@ -0,0 +1,12 @@ +class CreateAcademicInfos < ActiveRecord::Migration + def self.up + create_table :academic_infos do |t| + t.references :person + t.column :lattes_url, :string + end + end + + def self.down + drop_table :academic_infos + end +end diff --git a/plugins/lattes_curriculum/features/lattes_curriculum.feature b/plugins/lattes_curriculum/features/lattes_curriculum.feature new file mode 100644 index 0000000..176cdab --- /dev/null +++ b/plugins/lattes_curriculum/features/lattes_curriculum.feature @@ -0,0 +1,24 @@ +Feature: import lattes information + As an user + I want to inform my lattes url address + So that I can import my academic informations automatically + + Background: + Given "LattesCurriculumPlugin" plugin is enabled + And I am logged in as admin + And I go to /admin/plugins + And I check "LattesCurriculumPlugin" + And I press "Save changes" + And I am not logged in + + @selenium + Scenario: Import lattes informations after singup + Given I am on signup page + And 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 I fill in "URL Lattes" with "http://lattes.cnpq.br/2864976228727880" + And wait for the captcha signup time + And I press "Create my account" \ No newline at end of file diff --git a/plugins/lattes_curriculum/lib/academic_info.rb b/plugins/lattes_curriculum/lib/academic_info.rb new file mode 100644 index 0000000..aa7254d --- /dev/null +++ b/plugins/lattes_curriculum/lib/academic_info.rb @@ -0,0 +1,14 @@ +class AcademicInfo < ActiveRecord::Base + + belongs_to :person + + 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.")) + end + end +end diff --git a/plugins/lattes_curriculum/lib/ext/person.rb b/plugins/lattes_curriculum/lib/ext/person.rb index eca9f1d..7162332 100755 --- a/plugins/lattes_curriculum/lib/ext/person.rb +++ b/plugins/lattes_curriculum/lib/ext/person.rb @@ -2,14 +2,17 @@ require_dependency 'person' class Person - attr_accessible :lattes_url - validate :lattes_url_validate? - - def lattes_url_validate? - valid_url_start = 'http://lattes.cnpq.br/' - unless self.lattes_url =~ /http:\/\/lattes.cnpq.br\/\d+/ - errors[:base] << "Sorry, the lattes url is not valid." - end + attr_accessible :lattes_url, :academic_info_attributes + + has_one :academic_info, :dependent=>:delete + + accepts_nested_attributes_for :academic_info + + def lattes_url + self.academic_info.nil? ? nil : self.academic_info.lattes_url end -end \ No newline at end of file + def lattes_url= value + self.academic_info.lattes_url = value unless self.academic_info.nil? + end +end diff --git a/plugins/lattes_curriculum/lib/html_parser.rb b/plugins/lattes_curriculum/lib/html_parser.rb index 4c942f1..dbe1d8d 100755 --- a/plugins/lattes_curriculum/lib/html_parser.rb +++ b/plugins/lattes_curriculum/lib/html_parser.rb @@ -6,55 +6,57 @@ Encoding.default_external = Encoding::UTF_8 Encoding.default_internal = Encoding::UTF_8 class Html_parser - def get_html(lattes_link = "") + 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) - page = remove_img(page) - page = remove_select(page) - page = remove_footer(page) - page = remove_further_informations(page) + page = Nokogiri::HTML(open(lattes_link), nil, "UTF-8") + page = page.css(".main-content").to_s() + page = remove_class_tooltip(page) + page = remove_img(page) + page = remove_select(page) + page = remove_footer(page) + page = remove_further_informations(page) rescue - page = "" - end + page = "" + end end - def remove_class_tooltip(string = "") - while string.include? 'class="tooltip"' do - string['class="tooltip"'] = 'class="link_not_to_mark"' - end - return string - end - - def remove_img(string = "") - fist_part_to_keep, *rest = string.split('',2) - string = fist_part_to_keep + after_img.join(" ") + def remove_class_tooltip(page = "") + while page.include? 'class="tooltip"' do + page['class="tooltip"'] = 'class="link_not_to_mark"' end - def remove_select(string = "") - while string.include? '') - string = first_part_to_keep + after_img.join(" ") - end - return string - end + return page + end - def remove_footer(string = "") - first_part_to_keep, *rest = string.split('
') - second_part = rest.join(" ") - part_to_throw_away, *after_img = second_part.split('Imprimir Currículo') - string = first_part_to_keep + after_img.join(" ") - end + def remove_img(page = "") + fist_part_to_keep, *rest = page.split('',2) + page = fist_part_to_keep + after_img.join(" ") + end - def remove_further_informations(string = "") - first_part_to_keep, *rest = string.split('',2) - string = first_part_to_keep + after_img.join(" ") + def remove_select(page = "") + while page.include? '') + page = first_part_to_keep + after_img.join(" ") end + + return page + end + + def remove_footer(page = "") + first_part_to_keep, *rest = page.split('
') + second_part = rest.join(" ") + part_to_throw_away, *after_img = second_part.split('Imprimir Currículo') + page = first_part_to_keep + after_img.join(" ") + end + + def remove_further_informations(page = "") + first_part_to_keep, *rest = page.split('',2) + page = first_part_to_keep + after_img.join(" ") + end end diff --git a/plugins/lattes_curriculum/lib/lattes_curriculum_plugin.rb b/plugins/lattes_curriculum/lib/lattes_curriculum_plugin.rb index 902baba..e8d54d8 100755 --- a/plugins/lattes_curriculum/lib/lattes_curriculum_plugin.rb +++ b/plugins/lattes_curriculum/lib/lattes_curriculum_plugin.rb @@ -16,34 +16,65 @@ class LattesCurriculumPlugin < Noosfero::Plugin true end - def signup_extra_contents - lambda { - content_tag(:div, labelled_form_field(_('URL Lattes'), text_field(:profile_data, :lattes_url, :id => 'lattes_id_field')) + - content_tag(:small, _('The Lattes url is the link for your own curriculum so it\'ll be shown on your profile.'), - :class => 'signup-form', :id => 'lattes-id-balloon'), :id => 'signup-lattes-id') + 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 = { + :name => 'lattes_url', + :label => 'Lattes URL', + :object_name => :academic_infos, + :method => :lattes_url, + :value => context.profile.nil? ? "" : context.profile.academic_info.lattes_url } + + fields << lattes_url + + return fields end - def profile_info_extra_contents - if context.profile.person? - lattes_url = context.profile.lattes_url - lambda { - content_tag('div', labelled_form_field(_('URL Lattes'), text_field_tag('profile_data[lattes_url]', lattes_url, :id => 'lattes_url_field', :disabled => false)) + - content_tag(:small, _('The url lattes is the link for your lattes curriculum.'))) - } - 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.lattes_url.nil? - href = context.profile.lattes_url + unless context.profile.academic_info.nil? || context.profile.academic_info.lattes_url.nil? + href = context.profile.academic_info.lattes_url html_parser = Html_parser.new - { - :title => _("Lattes"), - :id => 'lattes_tab', - :content => lambda{html_parser.get_html(href)}, - :start => false + { + :title => _("Lattes"), + :id => 'lattes_tab', + :content => lambda{html_parser.get_html(href)}, + :start => false } end end + + def profile_editor_transaction_extras + if context.profile.person? + if context.params.has_key?(:academic_infos) + academic_info_transaction + end + end + end + + protected + + def academic_info_transaction + AcademicInfo.transaction do + context.profile.academic_info.update_attributes!(context.params[:academic_infos]) + end + end + end diff --git a/plugins/lattes_curriculum/public/singup_complement.js b/plugins/lattes_curriculum/public/singup_complement.js index 1ca7d94..04a0e29 100644 --- a/plugins/lattes_curriculum/public/singup_complement.js +++ b/plugins/lattes_curriculum/public/singup_complement.js @@ -1,15 +1,14 @@ -jQuery(function($) { +jQuery(function($){ $(document).ready(function(){ - $('#lattes_id_field').blur(function() { + $('#lattes_id_field').blur(function(){ var value = this.value - }) - $('#lattes_id_field').focus(function() { + $('#lattes_id_field').focus(function(){ $('#lattes-id-balloon').fadeIn('slow') }) - $('#lattes_id_field').blur(function() { + $('#lattes_id_field').blur(function(){ $('#lattes-id-balloon').fadeOut('slow') }) }) diff --git a/plugins/lattes_curriculum/test/unit/html_parser_test.rb b/plugins/lattes_curriculum/test/unit/html_parser_test.rb index a1dfa70..8f01b13 100644 --- a/plugins/lattes_curriculum/test/unit/html_parser_test.rb +++ b/plugins/lattes_curriculum/test/unit/html_parser_test.rb @@ -5,7 +5,7 @@ class HtmlParserTest < ActiveSupport::TestCase def setup @parser = Html_parser.new end - + should 'be not nil the instance' do assert_not_nil @parser end diff --git a/plugins/lattes_curriculum/test/unit/lattes_curriculum_test.rb b/plugins/lattes_curriculum/test/unit/lattes_curriculum_test.rb index ce76cb2..f6138a6 100644 --- a/plugins/lattes_curriculum/test/unit/lattes_curriculum_test.rb +++ b/plugins/lattes_curriculum/test/unit/lattes_curriculum_test.rb @@ -5,7 +5,7 @@ class LattesCurriculumPluginTest < ActiveSupport::TestCase def setup @plugin = LattesCurriculumPlugin.new end - + should 'be a noosfero plugin' do assert_kind_of Noosfero::Plugin, @plugin end -- libgit2 0.21.2