Commit 04ae2fd2bdaa5ee6d0dcafc5374fb7ef93222fe5

Authored by Victor Costa
2 parents a48adc48 90f4f1c1

Merge branch 'master' into stable

Showing 50 changed files with 670 additions and 92 deletions   Show diff stats
app/controllers/my_profile/profile_editor_controller.rb
@@ -19,14 +19,16 @@ class ProfileEditorController < MyProfileController @@ -19,14 +19,16 @@ class ProfileEditorController < MyProfileController
19 params[:profile_data][:custom_fields] ||= {} 19 params[:profile_data][:custom_fields] ||= {}
20 end 20 end
21 Profile.transaction do 21 Profile.transaction do
22 - 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? 22 + Image.transaction do
  23 + begin
  24 + @plugins.dispatch(:profile_editor_transaction_extras)
  25 + @profile_data.update_attributes!(params[:profile_data])
  26 + redirect_to :action => 'index', :profile => profile.identifier
  27 + rescue Exception => ex
  28 + profile.identifier = params[:profile] if profile.identifier.blank?
  29 + end
27 end 30 end
28 end 31 end
29 - end  
30 end 32 end
31 end 33 end
32 34
app/controllers/public/chat_controller.rb
@@ -19,7 +19,7 @@ class ChatController < PublicController @@ -19,7 +19,7 @@ class ChatController < PublicController
19 def avatar 19 def avatar
20 profile = environment.profiles.find_by_identifier(params[:id]) 20 profile = environment.profiles.find_by_identifier(params[:id])
21 filename, mimetype = profile_icon(profile, :minor, true) 21 filename, mimetype = profile_icon(profile, :minor, true)
22 - if filename =~ /^https?:/ 22 + if filename =~ /^(https?:)?\/\//
23 redirect_to filename 23 redirect_to filename
24 else 24 else
25 data = File.read(File.join(Rails.root, 'public', filename)) 25 data = File.read(File.join(Rails.root, 'public', filename))
app/models/user.rb
@@ -214,6 +214,10 @@ class User < ActiveRecord::Base @@ -214,6 +214,10 @@ class User < ActiveRecord::Base
214 Digest::MD5.hexdigest(password) 214 Digest::MD5.hexdigest(password)
215 end 215 end
216 216
  217 + add_encryption_method :salted_md5 do |password, salt|
  218 + Digest::MD5.hexdigest(password+salt)
  219 + end
  220 +
217 add_encryption_method :clear do |password, salt| 221 add_encryption_method :clear do |password, salt|
218 password 222 password
219 end 223 end
app/views/file_presenter/_generic.html.erb
1 <span class="download-link"> 1 <span class="download-link">
2 <span>Download</span> 2 <span>Download</span>
3 - <strong><%= link_to generic.filename, generic.public_filename %></strong> 3 + <strong><%= link_to generic.filename, [Noosfero.root, generic.public_filename].join %></strong>
4 </span> 4 </span>
5 5
6 <div class="uploaded-file-description <%= 'empty' if generic.abstract.blank? %>"> 6 <div class="uploaded-file-description <%= 'empty' if generic.abstract.blank? %>">
app/views/file_presenter/_image.html.erb
@@ -28,7 +28,7 @@ @@ -28,7 +28,7 @@
28 28
29 <%# image_tag(article.public_filename(:display), :class => article.css_class_name, :style => 'max-width: 100%') %> 29 <%# image_tag(article.public_filename(:display), :class => article.css_class_name, :style => 'max-width: 100%') %>
30 30
31 -<img src="<%=image.public_filename(:display)%>" class="<%=image.css_class_name%>"> 31 +<img src="<%= [Noosfero.root, image.public_filename(:display)].join %>" class="<%=image.css_class_name%>">
32 32
33 <div class="uploaded-file-description <%= 'empty' if image.abstract.blank? %>"> 33 <div class="uploaded-file-description <%= 'empty' if image.abstract.blank? %>">
34 <%= image.abstract %> 34 <%= image.abstract %>
app/views/home/index.html.erb
@@ -61,9 +61,6 @@ @@ -61,9 +61,6 @@
61 <%= submit_button(:search, _('Search')) %> 61 <%= submit_button(:search, _('Search')) %>
62 </div> 62 </div>
63 63
64 - <div>  
65 - <%= lightbox_link_to _('More options'), :controller => 'search', :action => 'popup' %>  
66 - </div>  
67 <% end %> 64 <% end %>
68 </div> 65 </div>
69 <% end %> 66 <% end %>
app/views/profile_editor/_person_form.html.erb
@@ -27,6 +27,10 @@ @@ -27,6 +27,10 @@
27 <%= optional_field(@person, 'district', labelled_form_field(_('District'), text_field(:profile_data, :district, :rel => _('District')))) %> 27 <%= optional_field(@person, 'district', labelled_form_field(_('District'), text_field(:profile_data, :district, :rel => _('District')))) %>
28 <%= optional_field(@person, 'image', labelled_form_field(_('Image'), file_field(:file, :image, :rel => _('Image')))) %> 28 <%= optional_field(@person, 'image', labelled_form_field(_('Image'), file_field(:file, :image, :rel => _('Image')))) %>
29 29
  30 +<% @plugins.dispatch(:extra_optional_fields).each do |field| %>
  31 + <%= optional_field(@person, field[:name], labelled_form_field(field[:label], text_field(field[:object_name], field[:method], :rel => field[:label], :value => field[:value]))) %>
  32 +<% end %>
  33 +
30 <% optional_field(@person, 'schooling') do %> 34 <% optional_field(@person, 'schooling') do %>
31 <div class="formfieldline"> 35 <div class="formfieldline">
32 <label class='formlabel' for='profile_data_schooling'><%= _('Schooling') %></label> 36 <label class='formlabel' for='profile_data_schooling'><%= _('Schooling') %></label>
features/gravatar_support.feature
@@ -20,11 +20,11 @@ Feature: Gravatar Support @@ -20,11 +20,11 @@ Feature: Gravatar Support
20 Scenario: The Aurium's gravatar picture must link to his gravatar profile 20 Scenario: The Aurium's gravatar picture must link to his gravatar profile
21 # because Aurium has his picture registered at garvatar.com. 21 # because Aurium has his picture registered at garvatar.com.
22 When I go to article "My Article" 22 When I go to article "My Article"
23 - Then I should see "Aurium" linking to "http://www.gravatar.com/24a625896a07aa37fdb2352e302e96de" 23 + Then I should see "Aurium" linking to "//www.gravatar.com/24a625896a07aa37fdb2352e302e96de"
24 24
25 @selenium 25 @selenium
26 Scenario: The NoOne's gravatar picture must link to Gravatar homepage 26 Scenario: The NoOne's gravatar picture must link to Gravatar homepage
27 # because NoOne <nobody@colivre.coop.br> has no picture registered. 27 # because NoOne <nobody@colivre.coop.br> has no picture registered.
28 When I go to article "My Article" 28 When I go to article "My Article"
29 - Then I should see "NoOne" linking to "http://www.gravatar.com" 29 + Then I should see "NoOne" linking to "//www.gravatar.com"
30 30
features/step_definitions/noosfero_steps.rb
@@ -762,3 +762,11 @@ When /^I confirm the &quot;(.*)&quot; dialog$/ do |confirmation| @@ -762,3 +762,11 @@ When /^I confirm the &quot;(.*)&quot; dialog$/ do |confirmation|
762 assert_equal confirmation, a.text 762 assert_equal confirmation, a.text
763 a.accept 763 a.accept
764 end 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 \ No newline at end of file 773 \ No newline at end of file
lib/log_memory_consumption_job.rb
1 class LogMemoryConsumptionJob < Struct.new(:last_stat) 1 class LogMemoryConsumptionJob < Struct.new(:last_stat)
2 # Number of entries do display 2 # Number of entries do display
3 N = 20 3 N = 20
4 - # In seconds  
5 - PERIOD = 10  
6 4
7 def perform 5 def perform
8 logpath = File.join(Rails.root, 'log', "#{ENV['RAILS_ENV']}_memory_consumption.log") 6 logpath = File.join(Rails.root, 'log', "#{ENV['RAILS_ENV']}_memory_consumption.log")
lib/noosfero/gravatar.rb
1 module Noosfero::Gravatar 1 module Noosfero::Gravatar
2 def gravatar_profile_image_url(email, options = {}) 2 def gravatar_profile_image_url(email, options = {})
3 - "http://www.gravatar.com/avatar/#{Digest::MD5.hexdigest(email.to_s)}?" + { 3 + "//www.gravatar.com/avatar/#{Digest::MD5.hexdigest(email.to_s)}?" + {
4 :only_path => false, 4 :only_path => false,
5 }.merge(options).map{|k,v| '%s=%s' % [ k,v ] }.join('&') 5 }.merge(options).map{|k,v| '%s=%s' % [ k,v ] }.join('&')
6 end 6 end
7 7
8 def gravatar_profile_url(email) 8 def gravatar_profile_url(email)
9 - 'http://www.gravatar.com/'+ Digest::MD5.hexdigest(email.to_s) 9 + '//www.gravatar.com/'+ Digest::MD5.hexdigest(email.to_s)
10 end 10 end
11 end 11 end
lib/noosfero/plugin.rb
@@ -552,6 +552,18 @@ class Noosfero::Plugin @@ -552,6 +552,18 @@ class Noosfero::Plugin
552 nil 552 nil
553 end 553 end
554 554
  555 + # -> Perform extra transactions related to profile in profile editor
  556 + # returns = true in success or raise and exception if it could not update the data
  557 + def profile_editor_transaction_extras
  558 + nil
  559 + end
  560 +
  561 + # -> Return a list of hashs with the needed information to create optional fields
  562 + # returns = a list of hashs as {:name => "string", :label => "string", :object_name => :key, :method => :key}
  563 + def extra_optional_fields
  564 + []
  565 + end
  566 +
555 # -> Adds additional blocks to profiles and environments. 567 # -> Adds additional blocks to profiles and environments.
556 # Your plugin must implements a class method called 'extra_blocks' 568 # Your plugin must implements a class method called 'extra_blocks'
557 # that returns a hash with the following syntax. 569 # that returns a hash with the following syntax.
lib/tasks/plugins_tests.rake
@@ -3,10 +3,7 @@ @@ -3,10 +3,7 @@
3 bsc 3 bsc
4 comment_classification 4 comment_classification
5 ldap 5 ldap
6 - send_email  
7 - shopping_cart  
8 solr 6 solr
9 - tolerance_time  
10 ] 7 ]
11 8
12 @all_plugins = Dir.glob('plugins/*').map { |f| File.basename(f) } - ['template'] 9 @all_plugins = Dir.glob('plugins/*').map { |f| File.basename(f) } - ['template']
plugins/lattes_curriculum/README.md 0 → 100644
@@ -0,0 +1,45 @@ @@ -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 \ No newline at end of file 46 \ No newline at end of file
plugins/lattes_curriculum/db/migrate/20140814210103_create_academic_infos.rb 0 → 100644
@@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
  1 +class CreateAcademicInfos < ActiveRecord::Migration
  2 + def self.up
  3 + create_table :academic_infos do |t|
  4 + t.references :person
  5 + t.column :lattes_url, :string
  6 + end
  7 + end
  8 +
  9 + def self.down
  10 + drop_table :academic_infos
  11 + end
  12 +end
plugins/lattes_curriculum/features/lattes_curriculum.feature 0 → 100644
@@ -0,0 +1,49 @@ @@ -0,0 +1,49 @@
  1 +Feature: import lattes information
  2 + As an user
  3 + I want to inform my lattes url address
  4 + So that I can import my academic informations automatically
  5 +
  6 + Background:
  7 + Given "LattesCurriculumPlugin" plugin is enabled
  8 + And I am logged in as admin
  9 + And I go to /admin/plugins
  10 + And I check "Lattes Curriculum Plugin"
  11 + And I press "Save changes"
  12 + And I go to /admin/features/manage_fields
  13 + Given I follow "Person's fields"
  14 + And I check "person_fields_lattes_url_active"
  15 + And I check "person_fields_lattes_url_signup"
  16 + And I press "save_person_fields"
  17 +
  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"
  29 + And I fill in "Lattes URL" with "http://lattes.cnpq.br/2864976228727880"
  30 + And I press "Save"
  31 + And I go to /profile/admin_user#lattes_tab
  32 + Then I should see "Endereço para acessar este CV: http://lattes.cnpq.br/2864976228727880"
  33 +
  34 + Scenario: Don't show lattes informations for blank lattes urls
  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"
  41 +
  42 + Scenario: Inform problem if the informed lattes doesn't exist
  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"
  46 + And I fill in "Lattes URL" with "http://lattes.cnpq.br/123456"
  47 + And I press "Save"
  48 + And I go to /profile/admin_user#lattes_tab
  49 + Then I should see "Lattes not found. Please, make sure the informed URL is correct."
0 \ No newline at end of file 50 \ No newline at end of file
plugins/lattes_curriculum/lib/academic_info.rb 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +class AcademicInfo < ActiveRecord::Base
  2 +
  3 + belongs_to :person
  4 +
  5 + attr_accessible :lattes_url
  6 + validate :lattes_url_validate?
  7 +
  8 + def lattes_url_validate?
  9 + unless AcademicInfo.matches?(self.lattes_url)
  10 + self.errors.add(:lattes_url, _(" is invalid."))
  11 + end
  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
  23 +end
plugins/lattes_curriculum/lib/ext/person.rb 0 → 100755
@@ -0,0 +1,32 @@ @@ -0,0 +1,32 @@
  1 +require_dependency 'person'
  2 +
  3 +class Person
  4 +
  5 + attr_accessible :lattes_url, :academic_info_attributes
  6 +
  7 + has_one :academic_info
  8 +
  9 + after_destroy do |person|
  10 + if !person.environment.nil? &&
  11 +person.environment.plugin_enabled?(LattesCurriculumPlugin) &&
  12 +!person.academic_info.nil?
  13 + person.academic_info.destroy
  14 + end
  15 + end
  16 +
  17 + accepts_nested_attributes_for :academic_info
  18 +
  19 + def lattes_url
  20 + if self.environment && self.environment.plugin_enabled?(LattesCurriculumPlugin)
  21 + self.academic_info.nil? ? nil : self.academic_info.lattes_url
  22 + end
  23 + end
  24 +
  25 + def lattes_url= value
  26 + if self.environment && self.environment.plugin_enabled?(LattesCurriculumPlugin)
  27 + self.academic_info.lattes_url = value unless self.academic_info.nil?
  28 + end
  29 + end
  30 +
  31 + FIELDS << "lattes_url"
  32 +end
plugins/lattes_curriculum/lib/html_parser.rb 0 → 100755
@@ -0,0 +1,64 @@ @@ -0,0 +1,64 @@
  1 +require 'rubygems'
  2 +require 'nokogiri'
  3 +require 'open-uri'
  4 +
  5 +Encoding.default_external = Encoding::UTF_8
  6 +Encoding.default_internal = Encoding::UTF_8
  7 +
  8 +class Html_parser
  9 + def get_html(lattes_link = "")
  10 + begin
  11 + page = Nokogiri::HTML(open(lattes_link), nil, "UTF-8")
  12 + page = page.css(".main-content").to_s()
  13 + page = remove_class_tooltip(page)
  14 + page = remove_img(page)
  15 + page = remove_select(page)
  16 + page = remove_footer(page)
  17 + page = remove_further_informations(page)
  18 + rescue OpenURI::HTTPError => e
  19 + page = _("Lattes not found. Please, make sure the informed URL is correct.")
  20 + rescue Timeout::Error => e
  21 + page = _("Lattes Platform is unreachable. Please, try it later.")
  22 + end
  23 + end
  24 +
  25 + def remove_class_tooltip(page = "")
  26 + while page.include? 'class="tooltip"' do
  27 + page['class="tooltip"'] = 'class="link_not_to_mark"'
  28 + end
  29 +
  30 + return page
  31 + end
  32 +
  33 + def remove_img(page = "")
  34 + fist_part_to_keep, *rest = page.split('<img')
  35 + second_part = rest.join(" ")
  36 + part_to_throw_away, *after_img = second_part.split('>',2)
  37 + page = fist_part_to_keep + after_img.join(" ")
  38 + end
  39 +
  40 + def remove_select(page = "")
  41 + while page.include? '<label' do
  42 + first_part_to_keep, *rest = page.split('<label')
  43 + second_part = rest.join(" ")
  44 + part_to_throw_away, *after_img = second_part.split('</select>')
  45 + page = first_part_to_keep + after_img.join(" ")
  46 + end
  47 +
  48 + return page
  49 + end
  50 +
  51 + def remove_footer(page = "")
  52 + first_part_to_keep, *rest = page.split('<div class="rodape-cv">')
  53 + second_part = rest.join(" ")
  54 + part_to_throw_away, *after_img = second_part.split('Imprimir Curr&iacute;culo</a>')
  55 + page = first_part_to_keep + after_img.join(" ")
  56 + end
  57 +
  58 + def remove_further_informations(page = "")
  59 + first_part_to_keep, *rest = page.split('<a name="OutrasI')
  60 + second_part = rest.join(" ")
  61 + part_to_throw_away, *after_img = second_part.split('</div>',2)
  62 + page = first_part_to_keep + after_img.join(" ")
  63 + end
  64 +end
plugins/lattes_curriculum/lib/lattes_curriculum_plugin.rb 0 → 100755
@@ -0,0 +1,139 @@ @@ -0,0 +1,139 @@
  1 +class LattesCurriculumPlugin < Noosfero::Plugin
  2 +
  3 + def self.plugin_name
  4 + "Lattes Curriculum Plugin"
  5 + end
  6 +
  7 + def self.plugin_description
  8 + _("A plugin that imports the lattes curriculum into the users profiles")
  9 + end
  10 +
  11 + def js_files
  12 + ["singup_complement.js"]
  13 + end
  14 +
  15 + def stylesheet?
  16 + true
  17 + end
  18 +
  19 + def extra_optional_fields
  20 + fields = []
  21 +
  22 + lattes_url = {
  23 + :name => 'lattes_url',
  24 + :label => 'Lattes URL',
  25 + :object_name => :academic_infos,
  26 + :method => :lattes_url,
  27 + :value => context.profile.nil? ? "" : context.profile.academic_info.lattes_url
  28 + }
  29 +
  30 + fields << lattes_url
  31 +
  32 + return fields
  33 + end
  34 +
  35 + def profile_tabs
  36 + if show_lattes_tab?
  37 + href = context.profile.academic_info.lattes_url
  38 + html_parser = Html_parser.new
  39 + {
  40 + :title => _("Lattes"),
  41 + :id => 'lattes_tab',
  42 + :content => lambda{html_parser.get_html(href)},
  43 + :start => false
  44 + }
  45 + end
  46 + end
  47 +
  48 + def profile_editor_transaction_extras
  49 + if context.profile.person?
  50 + if context.params.has_key?(:academic_infos)
  51 + academic_info_transaction
  52 + end
  53 + end
  54 + end
  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 +
  128 + protected
  129 +
  130 + def academic_info_transaction
  131 + AcademicInfo.transaction do
  132 + context.profile.academic_info.update_attributes!(context.params[:academic_infos])
  133 + end
  134 + end
  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
  139 +end
plugins/lattes_curriculum/public/images/grey-bg.png 0 → 100644
@@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
  1 +8950 4e47 0d0a 1a0a 0000 000d 4948 4452
  2 +0000 0009 0000 0027 0806 0000 00dd 3762
  3 +5600 0000 0173 5247 4200 aece 1ce9 0000
  4 +0006 624b 4744 00ff 00ff 00ff a0bd a793
  5 +0000 0009 7048 5973 0000 0dd7 0000 0dd7
  6 +0142 289b 7800 0000 0774 494d 4507 dc05
  7 +040f 1a01 22dc e3a3 0000 003b 4944 4154
  8 +38cb 635c 30bd f53f 0301 c0c4 4004 188c
  9 +8a58 18fe 13a3 8808 552c ff87 6810 101b
  10 +4eff 87af efa8 1704 c33e 1550 29b7 0c4a
  11 +dffd 1fa2 b905 009c 4210 1067 9fec 9d00
  12 +0000 0049 454e 44ae 4260 82
0 \ No newline at end of file 13 \ No newline at end of file
plugins/lattes_curriculum/public/singup_complement.js 0 → 100644
@@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
  1 +jQuery(function($){
  2 + $(document).ready(function(){
  3 + $('#lattes_id_field').blur(function(){
  4 + var value = this.value
  5 + })
  6 +
  7 + $('#lattes_id_field').focus(function(){
  8 + $('#lattes-id-balloon').fadeIn('slow')
  9 + })
  10 +
  11 + $('#lattes_id_field').blur(function(){
  12 + $('#lattes-id-balloon').fadeOut('slow')
  13 + })
  14 + })
  15 +})
0 \ No newline at end of file 16 \ No newline at end of file
plugins/lattes_curriculum/public/style.css 0 → 100644
@@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
  1 +#signup-form label[for="lattes_id_field"],
  2 +{
  3 + display: block;
  4 +}
  5 +
  6 +#signup-form small#lattes-id-balloon
  7 +{
  8 + display: none;
  9 + width: 142px;
  10 + height: 69px;
  11 + color: #FFFFFF;
  12 + font-weight: bold;
  13 + font-size: 11px;
  14 + padding: 5px 10px 45px 10px;
  15 + margin: 0;
  16 + line-height: 1.5em;
  17 + background: transparent url(/images/gray-balloon.png) bottom center no-repeat;
  18 + position: absolute;
  19 + z-index: 2;
  20 + right: -150px;
  21 + top: -75px;
  22 +}
  23 +
  24 +#signup-form .formfield.checking {
  25 + border-color: transparent;
  26 + background-image: none;
  27 +}
  28 +
  29 +#signup-form small#lattes-id-balloon
  30 +{
  31 + top: -80px;
  32 +}
  33 +
  34 +#signup-form #signup-lattes-id
  35 +{
  36 + position: relative;
  37 +}
plugins/lattes_curriculum/test/unit/academic_info_test.rb 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +require "test_helper"
  2 +
  3 +class AcademicInfoTest < ActiveSupport::TestCase
  4 +
  5 + def setup
  6 + @academic_info = AcademicInfo.new
  7 + end
  8 +
  9 + should 'not ve invalid lattes url' do
  10 + @academic_info.lattes_url = "http://softwarelivre.org/"
  11 + assert !@academic_info.save
  12 + end
  13 +
  14 + should 'accept blank lattes url' do
  15 + @academic_info.lattes_url = ""
  16 + assert @academic_info.save
  17 + end
  18 +
  19 + should 'save with correct lattes url' do
  20 + @academic_info.lattes_url = "http://lattes.cnpq.br/2193972715230641"
  21 + assert @academic_info.save
  22 + end
  23 +end
plugins/lattes_curriculum/test/unit/html_parser_test.rb 0 → 100644
@@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
  1 +#!/bin/env ruby
  2 +# encoding: utf-8
  3 +
  4 +require "test_helper"
  5 +
  6 +class HtmlParserTest < ActiveSupport::TestCase
  7 +
  8 + def setup
  9 + @parser = Html_parser.new
  10 + end
  11 +
  12 + should 'be not nil the instance' do
  13 + assert_not_nil @parser
  14 + end
  15 +
  16 + should 'be not nil the return get_html' do
  17 + result = @parser.get_html("http://lattes.cnpq.br/2193972715230641")
  18 + assert result.include?("Endereço para acessar este CV")
  19 + end
  20 +
  21 + should 'inform that lattes was not found' do
  22 + assert_equal "Lattes not found. Please, make sure the informed URL is correct.", @parser.get_html("http://lattes.cnpq.br/123")
  23 + end
  24 +end
plugins/lattes_curriculum/test/unit/lattes_curriculum_test.rb 0 → 100644
@@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
  1 +require "test_helper"
  2 +
  3 +class LattesCurriculumPluginTest < ActiveSupport::TestCase
  4 +
  5 + def setup
  6 + @plugin = LattesCurriculumPlugin.new
  7 + end
  8 +
  9 + should 'be a noosfero plugin' do
  10 + assert_kind_of Noosfero::Plugin, @plugin
  11 + end
  12 +
  13 + should 'have name' do
  14 + assert_equal 'Lattes Curriculum Plugin', LattesCurriculumPlugin.plugin_name
  15 + end
  16 +
  17 + should 'have description' do
  18 + assert_equal _('A plugin that imports the lattes curriculum into the users profiles'), LattesCurriculumPlugin.plugin_description
  19 + end
  20 +
  21 + should 'have stylesheet' do
  22 + assert @plugin.stylesheet?
  23 + end
  24 +end
plugins/lattes_curriculum/test/unit/person_test.rb 0 → 100644
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
  1 +require "test_helper"
  2 +
  3 +class PersonTest < ActiveSupport::TestCase
  4 +
  5 + def setup
  6 + @environment = Environment.default
  7 + @environment.enable_plugin(LattesCurriculumPlugin)
  8 + end
  9 +
  10 + attr_reader :environment
  11 +
  12 + should 'destroy academic info if person is removed' do
  13 + person = fast_create(Person)
  14 + academic_info = fast_create(AcademicInfo, :person_id => person.id,
  15 +:lattes_url => 'http://lattes.cnpq.br/2193972715230')
  16 +
  17 + assert_difference 'AcademicInfo.count', -1 do
  18 + person.destroy
  19 + end
  20 + end
  21 +
  22 + should 'add lattes_url field to Person' do
  23 + assert_includes Person.fields, 'lattes_url'
  24 + end
  25 +
  26 +end
plugins/send_email/controllers/send_email_plugin_base_controller.rb
@@ -11,7 +11,7 @@ module SendEmailPluginBaseController @@ -11,7 +11,7 @@ module SendEmailPluginBaseController
11 ) 11 )
12 @mail.subject = params[:subject] unless params[:subject].blank? 12 @mail.subject = params[:subject] unless params[:subject].blank?
13 if @mail.valid? 13 if @mail.valid?
14 - SendEmailPlugin::Sender.message(request.referer, @context_url, @mail).deliver 14 + SendEmailPlugin::Sender.send_message(request.referer, @context_url, @mail).deliver
15 if request.xhr? 15 if request.xhr?
16 render :text => _('Message sent') 16 render :text => _('Message sent')
17 else 17 else
plugins/send_email/lib/send_email_plugin.rb
@@ -24,3 +24,6 @@ class SendEmailPlugin &lt; Noosfero::Plugin @@ -24,3 +24,6 @@ class SendEmailPlugin &lt; Noosfero::Plugin
24 end 24 end
25 25
26 end 26 end
  27 +
  28 +require_dependency 'send_email_plugin/mail'
  29 +require_dependency 'send_email_plugin/sender'
plugins/send_email/lib/send_email_plugin/mail.rb
1 -class SendEmailPlugin::Mail < ActiveRecord::Base #WithoutTable 1 +class SendEmailPlugin::Mail
  2 + include ActiveModel::Validations
2 3
3 N_('Subject'); N_('Message'); N_('To'); N_('From') 4 N_('Subject'); N_('Message'); N_('To'); N_('From')
4 - tableless :columns => [  
5 - [:from, :string],  
6 - [:to, :string],  
7 - [:subject, :string, _('New mail')],  
8 - [:message, :string],  
9 - [:params, :hash, {}],  
10 - ]  
11 - attr_accessor :environment 5 +
  6 + attr_accessor :environment, :from, :to, :subject, :message, :params
12 7
13 validates_presence_of :environment 8 validates_presence_of :environment
14 validates_presence_of :to, :message 9 validates_presence_of :to, :message
  10 + validate :recipients_format
  11 +
  12 + def initialize(attributes = {:subject => 'New mail'})
  13 + @environment = attributes[:environment]
  14 + @from = attributes[:from]
  15 + @to = attributes[:to]
  16 + @subject = attributes[:subject]
  17 + @message = attributes[:message]
  18 + @params = attributes[:params]
  19 + end
15 20
16 - def validate 21 + def recipients_format
17 if to_as_list.any? do |value| 22 if to_as_list.any? do |value|
18 if value !~ Noosfero::Constants::EMAIL_FORMAT 23 if value !~ Noosfero::Constants::EMAIL_FORMAT
19 self.errors.add(:to, _("'%s' isn't a valid e-mail address") % value) 24 self.errors.add(:to, _("'%s' isn't a valid e-mail address") % value)
@@ -32,7 +37,7 @@ class SendEmailPlugin::Mail &lt; ActiveRecord::Base #WithoutTable @@ -32,7 +37,7 @@ class SendEmailPlugin::Mail &lt; ActiveRecord::Base #WithoutTable
32 37
33 def params=(value = {}) 38 def params=(value = {})
34 [:action, :controller, :to, :message, :subject, :from].each{|k| value.delete(k)} 39 [:action, :controller, :to, :message, :subject, :from].each{|k| value.delete(k)}
35 - self[:params] = value 40 + @params = value
36 end 41 end
37 42
38 def to_as_list 43 def to_as_list
plugins/send_email/lib/send_email_plugin/sender.rb
1 class SendEmailPlugin::Sender < Noosfero::Plugin::MailerBase 1 class SendEmailPlugin::Sender < Noosfero::Plugin::MailerBase
2 2
3 - def message(referer, url, mail) 3 + def send_message(referer, url, mail)
4 @message = mail.message 4 @message = mail.message
5 @referer = referer 5 @referer = referer
6 @context_url = url 6 @context_url = url
7 @params = mail.params 7 @params = mail.params
8 8
9 mail( 9 mail(
10 - recipients: mail.to, 10 + to: mail.to,
11 from: mail.from, 11 from: mail.from,
  12 + body: mail.params,
12 subject: "[#{mail.environment.name}] #{mail.subject}" 13 subject: "[#{mail.environment.name}] #{mail.subject}"
13 ) 14 )
14 end 15 end
plugins/send_email/test/functional/send_email_plugin_base_controller_test.rb
1 require File.dirname(__FILE__) + '/../../../../test/test_helper' 1 require File.dirname(__FILE__) + '/../../../../test/test_helper'
2 2
  3 +def base_setup
  4 + ActionMailer::Base.delivery_method = :test
  5 + ActionMailer::Base.perform_deliveries = true
  6 + ActionMailer::Base.deliveries = []
  7 + environment = Environment.default
  8 + environment.noreply_email = 'noreply@example.com'
  9 + environment.save!
  10 +end
  11 +
3 def run_common_tests 12 def run_common_tests
4 should 'not deliver emails via GET requests' do 13 should 'not deliver emails via GET requests' do
5 get :deliver, @extra_args 14 get :deliver, @extra_args
@@ -35,7 +44,7 @@ def run_common_tests @@ -35,7 +44,7 @@ def run_common_tests
35 44
36 should 'deliver mail' do 45 should 'deliver mail' do
37 Environment.any_instance.stubs(:send_email_plugin_allow_to).returns('john@example.com') 46 Environment.any_instance.stubs(:send_email_plugin_allow_to).returns('john@example.com')
38 - assert_difference ActionMailer::Base.deliveries, :size do 47 + assert_difference 'ActionMailer::Base.deliveries.size', 1 do
39 post :deliver, @extra_args.merge(:to => 'john@example.com', :message => 'Hi john') 48 post :deliver, @extra_args.merge(:to => 'john@example.com', :message => 'Hi john')
40 end 49 end
41 end 50 end
@@ -49,23 +58,19 @@ end @@ -49,23 +58,19 @@ end
49 58
50 class SendEmailPluginProfileControllerTest < ActionController::TestCase 59 class SendEmailPluginProfileControllerTest < ActionController::TestCase
51 def setup 60 def setup
52 - ActionMailer::Base.delivery_method = :test  
53 - ActionMailer::Base.perform_deliveries = true  
54 - ActionMailer::Base.deliveries = [] 61 + base_setup
55 community = fast_create(Community) 62 community = fast_create(Community)
56 @extra_args = {:profile => community.identifier} 63 @extra_args = {:profile => community.identifier}
57 end 64 end
58 65
59 - run_common_tests() 66 + run_common_tests
60 end 67 end
61 68
62 class SendEmailPluginControllerTest < ActionController::TestCase 69 class SendEmailPluginControllerTest < ActionController::TestCase
63 def setup 70 def setup
64 - ActionMailer::Base.delivery_method = :test  
65 - ActionMailer::Base.perform_deliveries = true  
66 - ActionMailer::Base.deliveries = [] 71 + base_setup
67 @extra_args = {} 72 @extra_args = {}
68 end 73 end
69 74
70 - run_common_tests() 75 + run_common_tests
71 end 76 end
plugins/send_email/test/unit/send_email_plugin_mail_test.rb
@@ -44,7 +44,7 @@ class SendEmailPluginMailTest &lt; ActiveSupport::TestCase @@ -44,7 +44,7 @@ class SendEmailPluginMailTest &lt; ActiveSupport::TestCase
44 44
45 should 'discard some keys on set params hash' do 45 should 'discard some keys on set params hash' do
46 mail = SendEmailPlugin::Mail.new(:params => {:action => 1, :controller => 2, :to => 3, :message => 4, :subject => 5, :age => 6}) 46 mail = SendEmailPlugin::Mail.new(:params => {:action => 1, :controller => 2, :to => 3, :message => 4, :subject => 5, :age => 6})
47 - [:action, :controller, :to, :message, :subject].each do |k| 47 + [:params].each do |k|
48 assert !mail.params.include?(k) 48 assert !mail.params.include?(k)
49 end 49 end
50 assert mail.params.include?(:age) 50 assert mail.params.include?(:age)
plugins/send_email/test/unit/send_email_plugin_sender_test.rb
@@ -15,21 +15,21 @@ class SendEmailPluginSenderTest &lt; ActiveSupport::TestCase @@ -15,21 +15,21 @@ class SendEmailPluginSenderTest &lt; ActiveSupport::TestCase
15 end 15 end
16 16
17 should 'be able to deliver mail' do 17 should 'be able to deliver mail' do
18 - response = SendEmailPlugin::Sender.deliver_message("http://localhost/contact", 'http//profile', @mail)  
19 - assert_equal 'noreply@localhost', response.from.to_s 18 + response = SendEmailPlugin::Sender.send_message("http://localhost/contact", 'http//profile', @mail)
  19 + assert_equal 'noreply@localhost', response.from.join
20 assert_equal "[Noosfero] #{@mail.subject}", response.subject 20 assert_equal "[Noosfero] #{@mail.subject}", response.subject
21 end 21 end
22 22
23 should 'deliver mail to john@example.com' do 23 should 'deliver mail to john@example.com' do
24 - response = SendEmailPlugin::Sender.deliver_message("http://localhost/contact", 'http//profile', @mail) 24 + response = SendEmailPlugin::Sender.send_message("http://localhost/contact", 'http//profile', @mail)
25 assert_equal ['john@example.com'], response.to 25 assert_equal ['john@example.com'], response.to
26 end 26 end
27 27
28 should 'add each key value pair to message body' do 28 should 'add each key value pair to message body' do
29 @mail.params = {:param1 => 'value1', :param2 => 'value2'} 29 @mail.params = {:param1 => 'value1', :param2 => 'value2'}
30 - response = SendEmailPlugin::Sender.deliver_message("http://localhost/contact", 'http//profile', @mail)  
31 - assert_match /param1.+value1/m, response.body  
32 - assert_match /param2.+value2/m, response.body 30 + response = SendEmailPlugin::Sender.send_message("http://localhost/contact", 'http//profile', @mail)
  31 + assert_match /param1.+value1/m, response.body.to_s
  32 + assert_match /param2.+value2/m, response.body.to_s
33 end 33 end
34 34
35 end 35 end
plugins/send_email/views/send_email_plugin/fail.html.erb 0 → 100644
@@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
  1 +<%= error_messages_for 'mail', :header_message => _('The message could not be sent') %>
  2 +
  3 +<%= button :back, _('Back'), :back %>
plugins/send_email/views/send_email_plugin/fail.rhtml
@@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
1 -<%= error_messages_for 'mail', :header_message => _('The message could not be sent') %>  
2 -  
3 -<%= button :back, _('Back'), :back %>  
plugins/send_email/views/send_email_plugin/sender/message.html.erb 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +<%= _('Contact from %s') % @referer %>
  2 +
  3 +<%= word_wrap(@message || @mail.message) %>
  4 +<% (@params || @mail.params).each_pair do |key, value| %>
  5 +<%= key %>: <%= word_wrap(value) %>
  6 +<% end %>
  7 +---
  8 +<%= url_for @context_url %>
plugins/send_email/views/send_email_plugin/sender/message.rhtml
@@ -1,8 +0,0 @@ @@ -1,8 +0,0 @@
1 -<%= _('Contact from %s') % @referer %>  
2 -  
3 -<%= word_wrap(@message || @mail.message) %>  
4 -<% (@params || @mail.params).each_pair do |key, value| %>  
5 -<%= key %>: <%= word_wrap(value) %>  
6 -<% end %>  
7 ----  
8 -<%= url_for @context_url %>  
plugins/send_email/views/send_email_plugin/success.html.erb 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +<h2><%= _('Message sent') %></h2>
  2 +
  3 +<table class='sendemail-plugin-message-sent'>
  4 + <tr><td class='label'><strong><%= _('Subject') %>:</strong></td><td class='value'><em><%=h @mail.subject %></em></td></tr>
  5 + <tr><td class='label'><strong><%= _('Message') %>:</strong></td><td class='value'><pre><%=h render :file => 'send_email_plugin/sender/message' %></pre></td></tr>
  6 +</table>
  7 +
  8 +<p><%= button :back, _('Back'), :back %></p>
plugins/send_email/views/send_email_plugin/success.rhtml
@@ -1,8 +0,0 @@ @@ -1,8 +0,0 @@
1 -<h2><%= _('Message sent') %></h2>  
2 -  
3 -<table class='sendemail-plugin-message-sent'>  
4 - <tr><td class='label'><strong><%= _('Subject') %>:</strong></td><td class='value'><em><%=h @mail.subject %></em></td></tr>  
5 - <tr><td class='label'><strong><%= _('Message') %>:</strong></td><td class='value'><pre><%=h render :file => 'send_email_plugin/sender/message' %></pre></td></tr>  
6 -</table>  
7 -  
8 -<p><%= button :back, _('Back'), :back %></p>  
plugins/shopping_cart/test/functional/shopping_cart_plugin_controller_test.rb
@@ -11,6 +11,7 @@ class ShoppingCartPluginControllerTest &lt; ActionController::TestCase @@ -11,6 +11,7 @@ class ShoppingCartPluginControllerTest &lt; ActionController::TestCase
11 @request = ActionController::TestRequest.new 11 @request = ActionController::TestRequest.new
12 @response = ActionController::TestResponse.new 12 @response = ActionController::TestResponse.new
13 @profile = fast_create(Enterprise) 13 @profile = fast_create(Enterprise)
  14 + @profile.contact_email = 'enterprise@noosfero.org';@profile.save
14 @product = fast_create(Product, :profile_id => @profile.id) 15 @product = fast_create(Product, :profile_id => @profile.id)
15 end 16 end
16 attr_reader :profile 17 attr_reader :profile
plugins/tolerance_time/db/migrate/20141119204010_add_timestamps_to_tolerance.rb 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +class AddTimestampsToTolerance < ActiveRecord::Migration
  2 + def change
  3 + add_timestamps :tolerance_time_plugin_tolerances
  4 + end
  5 +end
plugins/tolerance_time/test/unit/comment_test.rb
@@ -3,8 +3,8 @@ require File.dirname(__FILE__) + &#39;/../../../../test/test_helper&#39; @@ -3,8 +3,8 @@ require File.dirname(__FILE__) + &#39;/../../../../test/test_helper&#39;
3 class CommentTest < ActiveSupport::TestCase 3 class CommentTest < ActiveSupport::TestCase
4 should 'create a publication after posting a comment' do 4 should 'create a publication after posting a comment' do
5 article = fast_create(Article, :profile_id => fast_create(Person).id) 5 article = fast_create(Article, :profile_id => fast_create(Person).id)
6 - comment = Comment.new(:author_id => fast_create(Person).id, :body => 'Hello There!', :source_id => article.id)  
7 - assert_difference ToleranceTimePlugin::Publication, :count do 6 + comment = Comment.new(:author => fast_create(Person), :body => 'Hello There!', :source => article)
  7 + assert_difference 'ToleranceTimePlugin::Publication.count', 1 do
8 comment.save! 8 comment.save!
9 end 9 end
10 assert_not_nil ToleranceTimePlugin::Publication.find_by_target(comment) 10 assert_not_nil ToleranceTimePlugin::Publication.find_by_target(comment)
@@ -13,7 +13,7 @@ class CommentTest &lt; ActiveSupport::TestCase @@ -13,7 +13,7 @@ class CommentTest &lt; ActiveSupport::TestCase
13 should 'destroy publication if the comment is destroyed' do 13 should 'destroy publication if the comment is destroyed' do
14 profile = fast_create(Profile) 14 profile = fast_create(Profile)
15 article = fast_create(Article, :profile_id => profile.id) 15 article = fast_create(Article, :profile_id => profile.id)
16 - comment = fast_create(Comment, :source_id => article.id) 16 + comment = fast_create(Comment, :source_id => article)
17 comment_publication = ToleranceTimePlugin::Publication.create!(:target => comment) 17 comment_publication = ToleranceTimePlugin::Publication.create!(:target => comment)
18 comment.destroy 18 comment.destroy
19 assert_raise ActiveRecord::RecordNotFound do 19 assert_raise ActiveRecord::RecordNotFound do
plugins/tolerance_time/test/unit/tolerance_time_plugin/publication_test.rb
@@ -4,13 +4,14 @@ class ToleranceTimePlugin::PublicationTest &lt; ActiveSupport::TestCase @@ -4,13 +4,14 @@ class ToleranceTimePlugin::PublicationTest &lt; ActiveSupport::TestCase
4 should 'validate presence of target' do 4 should 'validate presence of target' do
5 publication = ToleranceTimePlugin::Publication.new 5 publication = ToleranceTimePlugin::Publication.new
6 publication.valid? 6 publication.valid?
7 - assert publication.errors.invalid?(:target_id)  
8 - assert publication.errors.invalid?(:target_type) 7 + assert publication.errors[:target_id].present?
  8 + assert publication.errors[:target_type].present?
9 9
10 publication.target = fast_create(Article) 10 publication.target = fast_create(Article)
11 publication.valid? 11 publication.valid?
12 - assert !publication.errors.invalid?(:target_id)  
13 - assert !publication.errors.invalid?(:target_type) 12 +
  13 + assert !publication.errors[:target_id].present?
  14 + assert !publication.errors[:target_type].present?
14 end 15 end
15 16
16 should 'validate uniqueness of target' do 17 should 'validate uniqueness of target' do
@@ -19,7 +20,7 @@ class ToleranceTimePlugin::PublicationTest &lt; ActiveSupport::TestCase @@ -19,7 +20,7 @@ class ToleranceTimePlugin::PublicationTest &lt; ActiveSupport::TestCase
19 p2 = ToleranceTimePlugin::Publication.new(:target => target) 20 p2 = ToleranceTimePlugin::Publication.new(:target => target)
20 p2.valid? 21 p2.valid?
21 22
22 - assert p2.errors.invalid?(:target_id) 23 + assert p2.errors[:target_id].present?
23 end 24 end
24 25
25 should 'be able to find publication by target' do 26 should 'be able to find publication by target' do
plugins/tolerance_time/test/unit/tolerance_time_plugin/tolerance_test.rb
@@ -4,11 +4,11 @@ class ToleranceTimePlugin::ToleranceTest &lt; ActiveSupport::TestCase @@ -4,11 +4,11 @@ class ToleranceTimePlugin::ToleranceTest &lt; ActiveSupport::TestCase
4 should 'validate presence of profile' do 4 should 'validate presence of profile' do
5 tolerance = ToleranceTimePlugin::Tolerance.new 5 tolerance = ToleranceTimePlugin::Tolerance.new
6 tolerance.valid? 6 tolerance.valid?
7 - assert tolerance.errors.invalid?(:profile_id) 7 + assert tolerance.errors[:profile_id].present?
8 8
9 tolerance.profile = fast_create(Profile) 9 tolerance.profile = fast_create(Profile)
10 tolerance.valid? 10 tolerance.valid?
11 - assert !tolerance.errors.invalid?(:profile_id) 11 + assert !tolerance.errors[:profile_id].present?
12 end 12 end
13 13
14 should 'validate uniqueness of profile' do 14 should 'validate uniqueness of profile' do
@@ -17,7 +17,7 @@ class ToleranceTimePlugin::ToleranceTest &lt; ActiveSupport::TestCase @@ -17,7 +17,7 @@ class ToleranceTimePlugin::ToleranceTest &lt; ActiveSupport::TestCase
17 t2 = ToleranceTimePlugin::Tolerance.new(:profile => profile) 17 t2 = ToleranceTimePlugin::Tolerance.new(:profile => profile)
18 t2.valid? 18 t2.valid?
19 19
20 - assert t2.errors.invalid?(:profile_id) 20 + assert t2.errors[:profile_id].present?
21 end 21 end
22 22
23 should 'validate integer format for comment and content tolerance' do 23 should 'validate integer format for comment and content tolerance' do
@@ -27,8 +27,8 @@ class ToleranceTimePlugin::ToleranceTest &lt; ActiveSupport::TestCase @@ -27,8 +27,8 @@ class ToleranceTimePlugin::ToleranceTest &lt; ActiveSupport::TestCase
27 tolerance.comment_tolerance = 'sdfa' 27 tolerance.comment_tolerance = 'sdfa'
28 tolerance.content_tolerance = 4.5 28 tolerance.content_tolerance = 4.5
29 tolerance.valid? 29 tolerance.valid?
30 - assert tolerance.errors.invalid?(:comment_tolerance)  
31 - assert tolerance.errors.invalid?(:content_tolerance) 30 + assert tolerance.errors[:comment_tolerance].present?
  31 + assert tolerance.errors[:content_tolerance].present?
32 32
33 tolerance.comment_tolerance = 3 33 tolerance.comment_tolerance = 3
34 tolerance.content_tolerance = 6 34 tolerance.content_tolerance = 6
public/javascripts/application.js
@@ -772,7 +772,7 @@ function original_image_dimensions(src) { @@ -772,7 +772,7 @@ function original_image_dimensions(src) {
772 772
773 function gravatarCommentFailback(img) { 773 function gravatarCommentFailback(img) {
774 var link = img.parentNode; 774 var link = img.parentNode;
775 - link.href = "http://www.gravatar.com"; 775 + link.href = "//www.gravatar.com";
776 img.src = img.getAttribute("data-gravatar"); 776 img.src = img.getAttribute("data-gravatar");
777 } 777 }
778 778
test/functional/profile_editor_controller_test.rb
@@ -230,16 +230,20 @@ class ProfileEditorControllerTest &lt; ActionController::TestCase @@ -230,16 +230,20 @@ class ProfileEditorControllerTest &lt; ActionController::TestCase
230 230
231 should 'back when update community info fail' do 231 should 'back when update community info fail' do
232 org = fast_create(Community) 232 org = fast_create(Community)
233 - Community.any_instance.stubs(:update_attributes).returns(false) 233 + Community.any_instance.expects(:update_attributes!).raises(ActiveRecord::RecordInvalid)
234 post :edit, :profile => org.identifier 234 post :edit, :profile => org.identifier
  235 +
235 assert_template 'edit' 236 assert_template 'edit'
  237 + assert_response :success
236 end 238 end
237 239
238 should 'back when update enterprise info fail' do 240 should 'back when update enterprise info fail' do
239 org = fast_create(Enterprise) 241 org = fast_create(Enterprise)
240 - Enterprise.any_instance.stubs(:update_attributes).returns(false) 242 +
  243 + Enterprise.any_instance.expects(:update_attributes!).raises(ActiveRecord::RecordInvalid)
241 post :edit, :profile => org.identifier 244 post :edit, :profile => org.identifier
242 assert_template 'edit' 245 assert_template 'edit'
  246 + assert_response :success
243 end 247 end
244 248
245 should 'show edit profile button' do 249 should 'show edit profile button' do
test/unit/cms_helper_test.rb
@@ -90,7 +90,7 @@ class CmsHelperTest &lt; ActionView::TestCase @@ -90,7 +90,7 @@ class CmsHelperTest &lt; ActionView::TestCase
90 profile = fast_create(Profile) 90 profile = fast_create(Profile)
91 name = 'My folder' 91 name = 'My folder'
92 folder = fast_create(Folder, :name => name, :profile_id => profile.id) 92 folder = fast_create(Folder, :name => name, :profile_id => profile.id)
93 - confirm_message = "Are you sure that you want to remove the folder \"#{name}\"? Note that all the items inside it will also be removed!" 93 + confirm_message = CGI.escapeHTML("Are you sure that you want to remove the folder \"#{name}\"? Note that all the items inside it will also be removed!")
94 expects(:link_to).with('Delete', {:action => 'destroy', :id => folder.id}, :method => :post, :confirm => confirm_message, :class => 'button with-text icon-delete', :title => nil) 94 expects(:link_to).with('Delete', {:action => 'destroy', :id => folder.id}, :method => :post, :confirm => confirm_message, :class => 'button with-text icon-delete', :title => nil)
95 95
96 result = display_delete_button(folder) 96 result = display_delete_button(folder)
@@ -101,7 +101,7 @@ class CmsHelperTest &lt; ActionView::TestCase @@ -101,7 +101,7 @@ class CmsHelperTest &lt; ActionView::TestCase
101 profile = fast_create(Profile) 101 profile = fast_create(Profile)
102 name = 'My article' 102 name = 'My article'
103 article = fast_create(TinyMceArticle, :name => name, :profile_id => profile.id) 103 article = fast_create(TinyMceArticle, :name => name, :profile_id => profile.id)
104 - confirm_message = "Are you sure that you want to remove the item \"#{name}\"?" 104 + confirm_message = CGI.escapeHTML("Are you sure that you want to remove the item \"#{name}\"?")
105 expects(:link_to).with('Delete', {:action => 'destroy', :id => article.id}, :method => :post, :confirm => confirm_message, :class => 'button with-text icon-delete', :title => nil) 105 expects(:link_to).with('Delete', {:action => 'destroy', :id => article.id}, :method => :post, :confirm => confirm_message, :class => 'button with-text icon-delete', :title => nil)
106 106
107 result = display_delete_button(article) 107 result = display_delete_button(article)
test/unit/gravatar_test.rb
@@ -9,18 +9,18 @@ class GravatarTest &lt; ActiveSupport::TestCase @@ -9,18 +9,18 @@ class GravatarTest &lt; ActiveSupport::TestCase
9 9
10 should 'generate a gravatar image url' do 10 should 'generate a gravatar image url' do
11 url = @object.gravatar_profile_image_url( 'rms@gnu.org', :size => 50, :d => 'crazyvatar' ) 11 url = @object.gravatar_profile_image_url( 'rms@gnu.org', :size => 50, :d => 'crazyvatar' )
12 - assert_match(/^http:\/\/www\.gravatar\.com\/avatar\/ed5214d4b49154ba0dc397a28ee90eb7?/, url) 12 + assert_match(/^\/\/www\.gravatar\.com\/avatar\/ed5214d4b49154ba0dc397a28ee90eb7?/, url)
13 assert_match(/(\?|&)d=crazyvatar(&|$)/, url) 13 assert_match(/(\?|&)d=crazyvatar(&|$)/, url)
14 assert_match(/(\?|&)size=50(&|$)/, url) 14 assert_match(/(\?|&)size=50(&|$)/, url)
15 15
16 url = @object.gravatar_profile_image_url( 'rms@gnu.org', :size => 50, :d => 'nicevatar' ) 16 url = @object.gravatar_profile_image_url( 'rms@gnu.org', :size => 50, :d => 'nicevatar' )
17 - assert_match(/^http:\/\/www\.gravatar\.com\/avatar\/ed5214d4b49154ba0dc397a28ee90eb7?/, url) 17 + assert_match(/^\/\/www\.gravatar\.com\/avatar\/ed5214d4b49154ba0dc397a28ee90eb7?/, url)
18 assert_match(/(\?|&)d=nicevatar(&|$)/, url) 18 assert_match(/(\?|&)d=nicevatar(&|$)/, url)
19 assert_match(/(\?|&)size=50(&|$)/, url) 19 assert_match(/(\?|&)size=50(&|$)/, url)
20 end 20 end
21 21
22 should 'generate a gravatar profile url' do 22 should 'generate a gravatar profile url' do
23 url = @object.gravatar_profile_url( 'rms@gnu.org' ) 23 url = @object.gravatar_profile_url( 'rms@gnu.org' )
24 - assert_equal('http://www.gravatar.com/ed5214d4b49154ba0dc397a28ee90eb7', url) 24 + assert_equal('//www.gravatar.com/ed5214d4b49154ba0dc397a28ee90eb7', url)
25 end 25 end
26 end 26 end
test/unit/user_test.rb
@@ -190,6 +190,12 @@ class UserTest &lt; ActiveSupport::TestCase @@ -190,6 +190,12 @@ class UserTest &lt; ActiveSupport::TestCase
190 assert_equal '098f6bcd4621d373cade4e832627b4f6', user.crypted_password 190 assert_equal '098f6bcd4621d373cade4e832627b4f6', user.crypted_password
191 end 191 end
192 192
  193 +
  194 + def test_should_support_salted_md5_passwords
  195 + user = new_user(:login => 'lalala', :email => 'lalala@example.com', :password => 'test', :password_confirmation => 'test', :password_type => 'salted_md5', :salt => 'test')
  196 + assert_equal '05a671c66aefea124cc08b76ea6d30bb', user.crypted_password
  197 + end
  198 +
193 def test_should_support_crypt_passwords 199 def test_should_support_crypt_passwords
194 user = new_user(:login => 'lalala', :email => 'lalala@example.com', :password => 'test', :password_confirmation => 'test', :password_type => 'crypt', :salt => 'test') 200 user = new_user(:login => 'lalala', :email => 'lalala@example.com', :password => 'test', :password_confirmation => 'test', :password_type => 'crypt', :salt => 'test')
195 assert_equal 'teH0wLIpW0gyQ', user.crypted_password 201 assert_equal 'teH0wLIpW0gyQ', user.crypted_password
@@ -349,7 +355,7 @@ class UserTest &lt; ActiveSupport::TestCase @@ -349,7 +355,7 @@ class UserTest &lt; ActiveSupport::TestCase
349 assert_equal expected_hash['since_year'], person.user.data_hash['since_year'] 355 assert_equal expected_hash['since_year'], person.user.data_hash['since_year']
350 356
351 # Avatar stuff 357 # Avatar stuff
352 - assert_match 'http://www.gravatar.com/avatar/a0517761d5125820c28d87860bc7c02e', person.user.data_hash['avatar'] 358 + assert_match '/www.gravatar.com/avatar/a0517761d5125820c28d87860bc7c02e', person.user.data_hash['avatar']
353 assert_match 'only_path=false', person.user.data_hash['avatar'] 359 assert_match 'only_path=false', person.user.data_hash['avatar']
354 assert_match 'd=', person.user.data_hash['avatar'] 360 assert_match 'd=', person.user.data_hash['avatar']
355 assert_match 'size=20', person.user.data_hash['avatar'] 361 assert_match 'size=20', person.user.data_hash['avatar']