noosfero | 3 new commits pushed to repository

Daniela Feitosa gitlab at gitlab.com
Thu Feb 12 00:38:13 BRST 2015


Daniela Feitosa pushed to refs/heads/master at <a href="https://gitlab.com/noosfero/noosfero">Noosfero / noosfero</a>

Commits:
<a href="https://gitlab.com/noosfero/noosfero/commit/3600768ceceed5b804b5d208b0df307f9e7b1408">3600768c</a> by Aurélio A. Heckert
DatesHelper now uses i18n from Rails

- - - - -
<a href="https://gitlab.com/noosfero/noosfero/commit/7f062d8f89065ac1d4ab1f8e6de7906e8c99a276">7f062d8f</a> by Arthur Del Esposte
Introduce EventPlugin with EventBlock

ActionItem2119

Signed-off-by: Arthur Del Esposte <arthurmde at gmail.com>
Signed-off-by: Aurélio A. Heckert <aurelio at colivre.coop.br>

- - - - -
<a href="https://gitlab.com/noosfero/noosfero/commit/37e8561e4263d9f3146cf094ca14f15309d2159d">37e8561e</a> by Daniela Feitosa
Merge branch 'AI2119-EventBlockPlugin' into 'master'

Ai2119 event block plugin

Fix: https://gitlab.com/noosfero/noosfero/merge_requests/349

See merge request !400

- - - - -


Changes:

=====================================
app/helpers/dates_helper.rb
=====================================
--- a/app/helpers/dates_helper.rb
+++ b/app/helpers/dates_helper.rb
@@ -2,24 +2,14 @@ require 'noosfero/i18n'
 
 module DatesHelper
 
-  # FIXME Date#strftime should translate this for us !!!!
-  MONTHS = [
-    N_('January'),
-    N_('February'),
-    N_('March'),
-    N_('April'),
-    N_('May'),
-    N_('June'),
-    N_('July'),
-    N_('August'),
-    N_('September'),
-    N_('October'),
-    N_('November'),
-    N_('December')
-  ]
-
-  def month_name(n)
-    _(MONTHS[n-1])
+  MONTHS = I18n.t('date.month_names')
+
+  def month_name(n, abbreviated = false)
+    if abbreviated
+      I18n.t('date.abbr_month_names')[n]
+    else
+      MONTHS[n]
+    end
   end
 
   # formats a date for displaying.
@@ -91,15 +81,7 @@ module DatesHelper
       _(date.strftime("%a"))
     else
       # FIXME Date#strftime should translate this for us !!!!
-      _([
-        N_('Sunday'),
-        N_('Monday'),
-        N_('Tuesday'),
-        N_('Wednesday'),
-        N_('Thursday'),
-        N_('Friday'),
-        N_('Saturday'),
-      ][date.wday])
+      I18n.t('date.day_names')[date.wday]
     end
   end
 
@@ -111,7 +93,7 @@ module DatesHelper
       date = date << 1
     end
     if opts[:only_month]
-      _('%{month}') % {:month => month_name(date.month.to_i) }
+      _('%{month}') % { :month => month_name(date.month.to_i) }
     else
       _('%{month} %{year}') % { :year => date.year, :month => month_name(date.month.to_i) }
     end
@@ -156,7 +138,7 @@ module DatesHelper
     else
       order = [:day, :month, :year]
     end
-    date_select(object, method, html_options.merge(options.merge(:include_blank => true, :order => order, :use_month_names => MONTHS.map {|item| gettext(item)})))
+    date_select(object, method, html_options.merge(options.merge(:include_blank => true, :order => order, :use_month_names => MONTHS)))
   end
 
 end

=====================================
app/models/blog_archives_block.rb
=====================================
--- a/app/models/blog_archives_block.rb
+++ b/app/models/blog_archives_block.rb
@@ -36,8 +36,7 @@ class BlogArchivesBlock < Block
       results << content_tag('li', content_tag('strong', "#{year} (#{count})"))
       results << "<ul class='#{year}-archive'>"
       posts.except(:order).count(:all, :conditions => ['EXTRACT(YEAR FROM published_at)=?', year], :group => 'EXTRACT(MONTH FROM published_at)').sort_by {|month, count| -month.to_i}.each do |month, count|
-        month_name = gettext(MONTHS[month.to_i - 1])
-        results << content_tag('li', link_to("#{month_name} (#{count})", owner_blog.url.merge(:year => year, :month => month)))
+        results << content_tag('li', link_to("#{month_name(month.to_i)} (#{count})", owner_blog.url.merge(:year => year, :month => month)))
       end
       results << "</ul>"
     end

=====================================
app/models/event.rb
=====================================
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -141,6 +141,10 @@ class Event < Article
     result
   end
 
+  def duration
+    ((self.end_date || self.start_date) - self.start_date).to_i
+  end
+
   def lead
     content_tag('div',
       show_period(start_date, end_date),

=====================================
plugins/event/lib/event_plugin.rb
=====================================
--- /dev/null
+++ b/plugins/event/lib/event_plugin.rb
@@ -0,0 +1,23 @@
+class EventPlugin < Noosfero::Plugin
+
+  def self.plugin_name
+    _("Event Extras")
+  end
+
+  def self.plugin_description
+    _("Include a new block to show the environment's or profiles' events information")
+  end
+
+  def self.extra_blocks
+    { EventPlugin::EventBlock => { :type => [Community, Person, Enterprise, Environment] } }
+  end
+
+  def stylesheet?
+    true
+  end
+
+  def js_files
+    'event.js'
+  end
+
+end

=====================================
plugins/event/lib/event_plugin/event_block.rb
=====================================
--- /dev/null
+++ b/plugins/event/lib/event_plugin/event_block.rb
@@ -0,0 +1,87 @@
+class EventPlugin::EventBlock < Block
+  include DatesHelper
+
+  attr_accessible :all_env_events, :limit, :future_only, :date_distance_limit
+
+  settings_items :all_env_events, :type => :boolean, :default => false
+  settings_items :limit, :type => :integer, :default => 4
+  settings_items :future_only, :type => :boolean, :default => false
+  settings_items :date_distance_limit, :type => :integer, :default => 0
+
+  def self.description
+    _('Events')
+  end
+
+  def help
+    _('Show the profile events or all environment events.')
+  end
+
+  def events_source
+    unless all_env_events
+      if self.owner.kind_of? Environment
+        return self.owner
+      elsif environment.portal_community
+        return environment.portal_community
+      end
+    end
+
+    environment
+  end
+
+  def events(user = nil)
+    events = events_source.events
+    events = events.published.order('start_date')
+
+    if future_only
+      events = events.where('start_date >= ?', Date.today)
+    end
+
+    if date_distance_limit > 0
+      events = events.by_range([
+        Date.today - date_distance_limit,
+        Date.today + date_distance_limit
+      ])
+    end
+
+    event_list = []
+    events.each do |event|
+      event_list << event if event.display_to? user
+      break if event_list.length >= limit
+    end
+
+    event_list
+  end
+
+  def content(args={})
+    block = self
+    proc do
+      render(
+        :file => 'blocks/event',
+        :locals => { :block => block }
+      )
+    end
+  end
+
+  def human_time_left(days_left)
+    months_left = (days_left/30.0).round
+    if days_left <= -60
+      n_('Started one month ago.', 'Started %d months ago.', -months_left) % -months_left
+    elsif days_left < 0
+      n_('Started one day ago.', 'Started %d days ago.', -days_left) % -days_left
+    elsif days_left == 0
+      _("I happens today.")
+    elsif days_left < 60
+      n_('One day left to start.', '%d days left to start.', days_left) % days_left
+    else
+      n_('One month left to start.', '%d months left to start.', months_left) % months_left
+    end
+  end
+
+  def date_to_html(date)
+    content_tag(:span, show_day_of_week(date, true), :class => 'week-day') +
+    content_tag(:span, month_name(date.month, true), :class => 'month') +
+    content_tag(:span, date.day.to_s, :class => 'day') +
+    content_tag(:span, date.year.to_s, :class => 'year')
+  end
+
+end

=====================================
plugins/event/po/pt/event.po
=====================================
--- /dev/null
+++ b/plugins/event/po/pt/event.po
@@ -0,0 +1,110 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 1.0\n"
+"POT-Creation-Date: 2015-01-30 11:52-0000\n"
+"PO-Revision-Date: 2015-01-30 00:18-0000\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: plugins/event/lib/event_plugin/event_block.rb:12
+msgid "Events"
+msgstr "Eventos"
+
+#: plugins/event/lib/event_plugin/event_block.rb:16
+msgid "Show the profile events or all environment events."
+msgstr "Mostrar todos os eventos."
+
+#: plugins/event/lib/event_plugin/event_block.rb:68
+msgid "Started one month ago."
+msgid_plural "Started %d months ago."
+msgstr[0] "Iniciou a um mês atrás."
+msgstr[1] "Iniciou a %d meses atrás."
+
+#: plugins/event/lib/event_plugin/event_block.rb:70
+msgid "Started one day ago."
+msgid_plural "Started %d days ago."
+msgstr[0] "Iniciou a Um dia atrás."
+msgstr[1] "Iniciou a %d dias atrás."
+
+#: plugins/event/lib/event_plugin/event_block.rb:72
+msgid "I happens today."
+msgstr "Acontece hoje."
+
+#: plugins/event/lib/event_plugin/event_block.rb:74
+msgid "One day left to start."
+msgid_plural "%d days left to start."
+msgstr[0] "Um dia para iniciar."
+msgstr[1] "%d dias para iniciar."
+
+#: plugins/event/lib/event_plugin/event_block.rb:76
+msgid "One month left to start."
+msgid_plural "%d months left to start."
+msgstr[0] "Um mês para iniciar"
+msgstr[1] "% meses para iniciar"
+
+#: plugins/event/lib/event_plugin.rb:4
+msgid "Event Extras"
+msgstr "Eventos"
+
+#: plugins/event/lib/event_plugin.rb:8
+msgid ""
+"Include a new block to show the environment's or profiles' events information"
+msgstr ""
+"Adiciona um novo bloco para apresentar as informações de eventos do ambiente "
+"ou de perfis"
+
+#: plugins/event/views/profile_design/event_plugin/_event_block.html.erb:1
+msgid "Limit of items"
+msgstr "Limite de itens"
+
+#: plugins/event/views/profile_design/event_plugin/_event_block.html.erb:3
+msgid "Show all environment events"
+msgstr "Apresentar todos os eventos do ambiente"
+
+#: plugins/event/views/profile_design/event_plugin/_event_block.html.erb:8
+msgid "(Don't check to show only your events)"
+msgstr "(Não marque para apresentar somente seus eventos)"
+
+#: plugins/event/views/profile_design/event_plugin/_event_block.html.erb:10
+msgid "(Don't check to show only %s events)"
+msgstr "(Não marque para apresentar somente os eventos de %s)"
+
+#: plugins/event/views/profile_design/event_plugin/_event_block.html.erb:13
+msgid "(Don't check to show only the environment events)"
+msgstr "(Não marque para apresentar somente os eventos do ambiente)"
+
+#: plugins/event/views/profile_design/event_plugin/_event_block.html.erb:18
+msgid "Limit of days to display"
+msgstr "Limite de dias de distância para mostrar eventos"
+
+#: plugins/event/views/profile_design/event_plugin/_event_block.html.erb:20
+msgid "Only show events on this limit of days."
+msgstr "Mostar somente eventos que acontecem dentro do limite de dias"
+
+#: plugins/event/views/profile_design/event_plugin/_event_block.html.erb:23
+msgid "Only show future events"
+msgstr "Mostrar apenas eventos futuros"
+
+#: plugins/event/views/event_plugin/event_block_item.html.erb:6
+msgid "Duration: 1 day"
+msgid_plural "Duration: %s days"
+msgstr[0] ""
+msgstr[1] ""
+
+#~ msgid "1 day"
+#~ msgid_plural "%s days"
+#~ msgstr[0] "1 dia"
+#~ msgstr[1] "%s dias"
+
+#~ msgid "Event Block Plugin"
+#~ msgstr "Plugin de Bloco de Eventos"

=====================================
plugins/event/public/event.js
=====================================
--- /dev/null
+++ b/plugins/event/public/event.js
@@ -0,0 +1,16 @@
+(function(){
+  function change_title_size(){
+    jQuery(".event-plugin_event-block .event .title").each(function(num, el){
+      var title = jQuery(el);
+      console.log(title.height(), title.css("line-height"));
+      if (title.height() > parseInt(title.css("line-height")) * 2) {
+        title.addClass("toobig")
+      }
+    });
+  }
+
+
+  jQuery(document).ready(function(){
+    change_title_size();
+  });
+})();
\ No newline at end of file

=====================================
plugins/event/public/style.css
=====================================
--- /dev/null
+++ b/plugins/event/public/style.css
@@ -0,0 +1,186 @@
+.event-plugin_event-block {
+  font-size: 12px;
+}
+
+.event-plugin_event-block .events {
+  margin: 0;
+  padding: 0;
+  border-bottom: 1px solid #DDD;
+}
+
+.event-plugin_event-block .events li {
+  margin: 0;
+  padding: 1px 0;
+  list-style: none;
+  border-top: 1px solid #DDD;
+}
+
+.event-plugin_event-block .event a {
+  display: block;
+  min-height: 60px;
+  overflow: hidden;
+  padding: 3px 0;
+  text-decoration: none;
+  color: inherit;
+}
+
+.event-plugin_event-block .event a:hover {
+  background-color: #EEE;
+  text-decoration: none;
+  color: inherit;
+}
+
+.event-plugin_event-block .event a:visited {
+  color: inherit;
+}
+
+.event-plugin_event-block .event .date {
+  display: block;
+  width: 60px;
+  height: auto;
+  background-size: cover;
+  background-position: 50% 40%;
+  font-weight: bold;
+  text-align: center;
+  float: left;
+  margin-right: 10px;
+}
+
+.event-plugin_event-block .event .date.no-img {
+  background-color: #AAA;
+}
+
+.event-plugin_event-block .event:hover .date.no-img {
+  background-color: #79B;
+}
+
+.event-plugin_event-block .event:hover .date.no-img * {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.event-plugin_event-block .event .month {
+  display: block;
+  background: rgba(90,90,90,0.6);
+  color: #FFF;
+  text-shadow: 0 0 2px #000;
+  font-size: 20px;
+  line-height: 22px;
+}
+
+.msie8 .event-plugin_event-block .event .month{
+  background: #797979;
+  width: 60px;
+  float: left;
+  text-align: center;
+}
+
+.event-plugin_event-block .event:hover .has-img .month {
+  opacity: 0.9;
+  background: rgba(90,90,90,0.4);
+}
+
+.msie8 .event-plugin_event-block .event:hover .has-img .month {
+  background: #D8D8D8;
+}
+
+.event-plugin_event-block .event .day {
+  display: block;
+  background: rgba(255,255,255,0.5);
+  border: 2px solid rgba(90,90,90,0.6);
+  border-top: none;
+  color: #000;
+  font-size: 36px;
+  line-height: 36px;
+}
+
+.msie8 .event-plugin_event-block .event .day {
+  display: block;
+  background: #D4D4D4;
+  border: 2px solid  #797979;
+  width: 56px;
+  text-align: center;
+}
+
+.event-plugin_event-block .event .has-img .day {
+  text-shadow: 0 0 5px #FFF, 0 0 5px #FFF;
+}
+
+.event-plugin_event-block .event:hover .has-img .day {
+  opacity: 0.8;
+  background: rgba(255,255,255,0.3);
+}
+
+.event-plugin_event-block .event:hover .has-img .day {
+  filter: alpha(opacity=80);
+}
+
+.msie8 .event-plugin_event-block .event:hover .has-img .day{
+  background: #D4D4D4;
+}
+
+.event-plugin_event-block .event .duration {
+  display: block;
+}
+
+.event-plugin_event-block .event .duration span {
+  font-weight: bold;
+}
+
+#content .event-plugin_event-block .event .title {
+  position: relative;
+  display: block;
+  font-size: 14px;
+  line-height: 16px;
+  margin: 0;
+  overflow: hidden;
+  max-height: 33px;
+}
+
+.event-plugin_event-block .event .title.toobig:after {
+  content: "...";
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  width: 5em;
+  padding-right: 4px;
+  text-align: right;
+  color: rgba(0, 0, 0, 0.5);
+  background: -webkit-gradient(linear, left top, right top,
+    from(rgba(255, 255, 255, 0)), to(#FFF), color-stop(80%, #FFF));
+  background: -moz-linear-gradient(to right, rgba(255, 255, 255, 0), #FFF 80%, #FFF);
+  background: -ms-linear-gradient(to right, rgba(255, 255, 255, 0), #FFF 80%, #FFF);
+  background: -o-linear-gradient(to right, rgba(255, 255, 255, 0), #FFF 80%, #FFF);
+  background: linear-gradient(to right, rgba(255, 255, 255, 0), #FFF 80%, #FFF);
+}
+
+.event-plugin_event-block .event:hover .title.toobig:after {
+  background: -webkit-gradient(linear, left top, right top,
+    from(rgba(238, 238, 238, 0)), to(#EEE), color-stop(80%, #EEE));
+  background: -moz-linear-gradient(to right, rgba(238, 238, 238, 0), #EEE 80%, #EEE);
+  background: -ms-linear-gradient(to right, rgba(238, 238, 238, 0), #EEE 80%, #EEE);
+  background: -o-linear-gradient(to right, rgba(238, 238, 238, 0), #EEE 80%, #EEE);
+  background: linear-gradient(to right, rgba(238, 238, 238, 0), #EEE 80%, #EEE);
+}
+
+.event-plugin_event-block .event .address i {
+  display: block;
+  font-style: normal;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.event-plugin_event-block .event .days-left {
+  display: block;
+}
+
+.event-plugin_event-block .event .days-left.past {
+  filter: alpha(opacity=50);
+}
+
+.msie8 #content .event-plugin_event-block .event .title,
+.msie8 #content .event-plugin_event-block .event .adress i,
+.msie8 #content .event-plugin_event-block .event .days-left {
+  float: left;
+}

=====================================
plugins/event/test/functional/event_block_test.rb
=====================================
--- /dev/null
+++ b/plugins/event/test/functional/event_block_test.rb
@@ -0,0 +1,70 @@
+require File.dirname(__FILE__) + '/../../../../test/test_helper'
+
+# Re-raise errors caught by the controller.
+class HomeController
+  #append_view_path File.join(File.dirname(__FILE__) + '/../../views')
+  def rescue_action(e)
+    raise e
+  end
+end
+
+class HomeControllerTest < ActionController::TestCase
+
+  def setup
+    @env = Environment.default
+    @env.enable_plugin('EventPlugin')
+
+    @p1  = fast_create(Person, :environment_id => @env.id)
+    @e1a = fast_create(Event, :name=>'Event p1 A', :profile_id=>@p1.id)
+
+    box = Box.create!(:owner => @env)
+    @block = EventPlugin::EventBlock.create!(:box => box)
+  end
+
+  # Event item CSS selector
+  ev = '.event-plugin_event-block ul.events li.event[itemscope]' +
+       '[itemtype="http://data-vocabulary.org/Event"] '
+
+  should 'see events microdata sturcture' do
+    get :index
+    assert_select '.event-plugin_event-block ul.events'
+    assert_select ev
+    assert_select ev + 'a[itemprop="url"]'
+    assert_select ev + 'time.date[itemprop="startDate"][datetime]'
+    assert_select ev + 'time.date .day'
+    assert_select ev + 'time.date .month'
+    assert_select ev + 'time.date .year'
+    assert_select ev + '.title[itemprop="summary"]'
+    assert_select ev + '.address[itemprop="location"] *[itemprop="name"]'
+    assert_select ev + '.days-left'
+  end
+
+  should 'see event duration' do
+    @e1a.slug = 'event1a'
+    @e1a.start_date = Date.today
+    @e1a.end_date = Date.tomorrow
+    @e1a.save!
+    get :index
+    assert_select ev + 'time.duration[itemprop="endDate"]', '+1 day'
+
+    @e1a.slug = 'event1a'
+    @e1a.start_date = Date.today
+    @e1a.end_date = Date.tomorrow+1
+    @e1a.save!
+    get :index
+    assert_select ev + 'time.duration[itemprop="endDate"]', '+2 days'
+  end
+
+  should 'not see event duration for one day events' do
+    get :index
+    assert_select ev + 'time.duration[itemprop="endDate"]', false
+
+    @e1a.slug = 'event1a'
+    @e1a.start_date = Date.today
+    @e1a.end_date = Date.today
+    @e1a.save!
+    get :index
+    assert_select ev + 'time.duration[itemprop="endDate"]', false
+  end
+
+end

=====================================
plugins/event/test/unit/event_block_test.rb
=====================================
--- /dev/null
+++ b/plugins/event/test/unit/event_block_test.rb
@@ -0,0 +1,189 @@
+require File.dirname(__FILE__) + '/../../../../test/test_helper'
+
+class EventPlugin::EventBlockTest < ActiveSupport::TestCase
+
+  def setup
+    @env = Environment.default
+    @env.enable_plugin('EventPlugin')
+
+    @p1  = fast_create(Person, :environment_id => @env.id)
+    @event = fast_create(Event, :name => 'Event p1 A', :profile_id => @p1.id,
+                          :start_date => Date.today+30)
+    fast_create(Event, :name => 'Event p1 B', :profile_id => @p1.id,
+                  :start_date => Date.today+10)
+
+    @p2  = fast_create(Community, :environment_id => @env.id)
+    fast_create(Event, :name => 'Event p2 A', :profile_id => @p2.id,
+                  :start_date => Date.today-10)
+    fast_create(Event, :name => 'Event p2 B', :profile_id => @p2.id,
+                  :start_date => Date.today-30)
+
+    box = fast_create(Box, :owner_id => @p1)
+    @block = EventPlugin::EventBlock.new(:limit => 99, :box => box)
+  end
+
+  def set_portal(env, portal)
+    env.portal_community = portal
+    env.enable('use_portal_community')
+    env.save!
+  end
+
+  should 'select source as env, while visiting the profile' do
+    @block.box.owner = @p1
+    @block.all_env_events = true
+
+    assert_equal @env, @block.events_source
+    assert_equal 4, @block.events.length
+
+    set_portal(@env, @p2)
+
+    assert_equal @env, @block.events_source
+    assert_equal 4, @block.events.length
+  end
+
+  should 'select source as env, while visiting an env page' do
+    @block.box.owner = @env
+    @block.all_env_events = true
+
+    assert_equal @env, @block.events_source
+    assert_equal 4, @block.events.length
+
+    set_portal @env, @p2
+
+    assert_equal @env, @block.events_source
+    assert_equal 4, @block.events.length
+  end
+
+  should 'select source as portal_community, while visiting an env page' do
+    set_portal @env, @p2
+
+    @block.box.owner = @env.portal_community
+    @block.all_env_events = false
+
+    assert_equal @p2, @block.events_source
+    assert_equal 2, @block.events.length
+  end
+
+  should 'select source as profile, while visiting its page' do
+    @block.stubs(:owner).returns(@p1)
+    @block.all_env_events = false
+
+    assert_equal @p1, @block.events_source
+    assert_equal 2, @block.events.length
+
+    set_portal @env, @p2
+
+    assert_equal @p1, @block.events_source
+    assert_equal 2, @block.events.length
+  end
+
+  should 'say human left time for an event' do
+    one_day = @block.human_time_left(Date.tomorrow - Date.today)
+
+    assert_match /One day left/, one_day
+    assert_match /5 days left/, @block.human_time_left(5)
+    assert_match /30 days left/, @block.human_time_left(30)
+    assert_match /2 months left/, @block.human_time_left(60)
+    assert_match /3 months left/, @block.human_time_left(85)
+  end
+
+  should 'say human past time for an event' do
+    one_day = @block.human_time_left(Date.yesterday - Date.today)
+
+    assert_match /One day past/, one_day
+    assert_match /5 days past/, @block.human_time_left(-5)
+    assert_match /30 days past/, @block.human_time_left(-30)
+    assert_match /2 months past/, @block.human_time_left(-60)
+    assert_match /3 months past/, @block.human_time_left(-85)
+  end
+
+  should 'write formatable data in html' do
+    html = '<span class="week-day">Tue</span>'+
+           '<span class="month">Sep</span>'+
+           '<span class="day">27</span>'+
+           '<span class="year">1983</span>'
+
+    assert_equal html, @block.date_to_html(Date.new 1983, 9, 27)
+  end
+
+  should 'show unlimited time distance events' do
+    @block.box.owner = @env
+    @block.all_env_events = true
+    @block.date_distance_limit = 0
+
+    assert_equal 4, @block.events.length
+  end
+
+  should 'only show 20 days distant events' do
+    @block.box.owner = @env
+    @block.all_env_events = true
+    @block.date_distance_limit = 20
+
+    assert_equal 2, @block.events.length
+  end
+
+  should 'show future and past events' do
+    @block.box.owner = @env
+    @block.all_env_events = true
+    @block.future_only = false
+
+    assert_equal 4, @block.events.length
+  end
+
+  should 'show only future events' do
+    @block.box.owner = @env
+    @block.all_env_events = true
+    @block.future_only = true
+
+    assert_equal 2, @block.events.length
+  end
+
+  should 'show only published events' do
+    @block.box.owner = @env
+    @block.all_env_events = true
+    @event.published = false
+    @event.save!
+
+    assert_equal 3, @block.events.length
+  end
+
+  should 'filter events from non public profiles' do
+    person  = create_user('testuser', :environment_id => @env.id).person
+    person.public_profile = false
+    person.save!
+
+    visibility_content_test_from_a_profile person
+  end
+
+  should 'filter events from non visible profiles' do
+    person = create_user('testuser', :environment_id=>@env.id).person
+    person.visible = false
+    person.save!
+
+    visibility_content_test_from_a_profile person
+  end
+
+  def visibility_content_test_from_a_profile(profile)
+    @block.box.owner = @env
+    ev = fast_create Event, :name => '2 de Julho', :profile_id => profile.id
+    @block.all_env_events = true
+
+    # Do not list event from private profile for non logged visitor
+    assert ! @block.events.include?(ev)
+    assert_equal 4, @block.events.length
+
+    # Do not list event from private profile for non unprivileged user
+    assert ! @block.events.include?(ev)
+    assert_equal 4, @block.events(@p1).length
+
+    # Must to list event from private profile for a friend
+    AddFriend.create!(:requestor => @p1, :target => profile).finish
+
+    assert @block.events(@p1).include?(ev)
+    assert_equal 5, @block.events(@p1).length
+
+    # Must to list event from private profile for itself
+    assert @block.events(profile).include?(ev)
+    assert_equal 5, @block.events(profile).length
+  end
+end

=====================================
plugins/event/test/unit/event_plugin_test.rb
=====================================
--- /dev/null
+++ b/plugins/event/test/unit/event_plugin_test.rb
@@ -0,0 +1,9 @@
+require File.dirname(__FILE__) + '/../../../../test/test_helper'
+
+class EventPluginTest < ActiveSupport::TestCase
+
+  should 'not crash' do
+    EventPlugin.new
+  end
+
+end

=====================================
plugins/event/views/blocks/event.html.erb
=====================================
--- /dev/null
+++ b/plugins/event/views/blocks/event.html.erb
@@ -0,0 +1,19 @@
+<%= block_title(block.title) %>
+
+<ul class="events">
+  <% block.events(@user).map do |event| %>
+    <% days_left = ( event.start_date - Date.today ).round %>
+      <li itemscope="itemscope" itemtype="http://data-vocabulary.org/Event" class="event">
+        <%= render(
+              :file => 'event_plugin/event_block_item',
+              :locals => {
+                :event => event,
+                :block => block,
+                :time_class => days_left < 0 ? 'future' : 'past',
+                :time_left_str => block.human_time_left(days_left)
+              }
+            )
+        %>
+      </li>
+  <% end %>
+</ul>

=====================================
plugins/event/views/environment_design
=====================================
--- /dev/null
+++ b/plugins/event/views/environment_design
@@ -0,0 +1 @@
+profile_design
\ No newline at end of file

=====================================
plugins/event/views/event_plugin/event_block_item.html.erb
=====================================
--- /dev/null
+++ b/plugins/event/views/event_plugin/event_block_item.html.erb
@@ -0,0 +1,41 @@
+<%
+  # compute layout values
+  ev_days_tag = ''
+  if event.duration > 0
+    ev_days_tag = content_tag('time',
+      n_('Duration: 1 day', 'Duration: %s days', event.duration) % "<b>#{event.duration}</b>",
+      :itemprop => 'endDate',
+      :datetime => show_date(event.end_date) + 'T00:00',
+      :class => 'duration',
+      :title => show_date(event.start_date) + ' — ' + time_left_str
+    )
+  end
+
+  img = event.image.nil? ? event.first_image : event.image.public_filename
+  bg = "background-image: url(#{img})" if not img.blank?
+  img_class = img.blank? ? 'no-img' : 'has-img'
+%>
+<%=
+  link_to([
+      content_tag('time',
+        block.date_to_html(event.start_date),
+        :itemprop => 'startDate',
+        :datetime => show_date(event.start_date),
+        :class => 'date ' + img_class, :style => bg,
+        :title => show_date(event.start_date) + ' — ' + time_left_str
+      ),
+      ev_days_tag,
+      content_tag('strong', h(event.name), :class => 'title',
+                  :title => event.name, :itemprop => 'summary'),
+      content_tag('span', content_tag('i', event.address, :itemprop=>:name),
+                  :title => h(event.address),
+                  :class => 'address', :itemscope => :itemscope,
+                  :itemtype => 'http://schema.org/Place',
+                  :itemprop => :location),
+      content_tag('span', time_left_str, :class => 'days-left ' + time_class)
+    ].join("\n"),
+    (event.link.blank? ? event.url : event.link),
+    :class => 'ev-days-' + event.duration.to_s,
+    :itemprop => :url
+  )
+%>

=====================================
plugins/event/views/profile_design/event_plugin/_event_block.html.erb
=====================================
--- /dev/null
+++ b/plugins/event/views/profile_design/event_plugin/_event_block.html.erb
@@ -0,0 +1,23 @@
+<%= labelled_form_field _('Limit of items'), text_field(:block, :limit, :size => 4) %>
+
+<%= labelled_check_box(_('Show all environment events'), "block[all_env_events]", "1", @block.all_env_events) %>
+<br>
+<small><%=
+  if @profile
+    if @profile.person?
+      _("(Don't check to show only your events)")
+    else
+      _("(Don't check to show only %s events)") % @profile.name
+    end
+  elsif environment.portal_community
+    _("(Don't check to show only the environment events)")
+  end
+%></small>
+<br>
+
+<%= labelled_form_field _('Limit of days to display'),
+                        text_field(:block, :date_distance_limit, :size => 4) %>
+<small>(<%=_('Only show events on this limit of days.')%>)</small>
+<br><br>
+
+<%= labelled_check_box(_('Only show future events'), "block[future_only]", "1", @block.future_only) %>

=====================================
test/factories.rb
=====================================
--- a/test/factories.rb
+++ b/test/factories.rb
@@ -247,7 +247,13 @@ module Noosfero::Factory
   ###############################################
 
   def defaults_for_event
-    { :name => 'My event ' + factory_num_seq.to_s, :start_date => Date.today }
+    num = factory_num_seq.to_s
+    {
+      :name => 'My event ' + num,
+      :slug => 'my-event-' + num,
+      :path => '/my-event-' + num,
+      :start_date => Date.today
+    }
   end
 
   ###############################################

=====================================
test/unit/dates_helper_test.rb
=====================================
--- a/test/unit/dates_helper_test.rb
+++ b/test/unit/dates_helper_test.rb
@@ -5,13 +5,16 @@ class DatesHelperTest < ActiveSupport::TestCase
   include DatesHelper
 
   should 'translate month names' do
-    expects(:_).with('January').returns('Janeiro')
-    assert_equal "Janeiro", month_name(1)
+    assert_equal "January", month_name(1)
+  end
+
+  should 'translate abbreviated month names' do
+    assert_equal "Sep", month_name(9, true)
   end
 
   should 'display date with translation' do
+    expects(:month_name).with(1).returns('Janeiro')
     expects(:_).with('%{month_name} %{day}, %{year}').returns('%{day} de %{month_name} de %{year}')
-    expects(:_).with('January').returns('Janeiro')
     assert_equal '11 de Janeiro de 2008', show_date(Date.new(2008, 1, 11))
   end
 
@@ -68,75 +71,48 @@ class DatesHelperTest < ActiveSupport::TestCase
   end
 
   should 'show day of week' do
-    expects(:_).with("Sunday").returns("Domingo")
-    date = mock
-    date.expects(:wday).returns(0)
-    assert_equal "Domingo", show_day_of_week(date)
+    assert_equal "Thursday", show_day_of_week(Date.new(2014,10,23))
   end
 
   should 'show abbreviated day of week' do
-    expects(:_).with("Sun").returns("Dom")
     date = Date.new(2009, 10, 25)
-    assert_equal "Dom", show_day_of_week(date, true)
+    assert_equal "Sun", show_day_of_week(date, true)
   end
 
   should 'show month' do
-    expects(:_).with('January').returns('January')
-    expects(:_).with('%{month} %{year}').returns('%{month} %{year}')
     assert_equal 'January 2008', show_month(2008, 1)
   end
 
   should 'fallback to current year/month in show_month' do
     Date.expects(:today).returns(Date.new(2008,11,1)).at_least_once
-
-    expects(:_).with('November').returns('November').at_least_once
-    expects(:_).with('%{month} %{year}').returns('%{month} %{year}').at_least_once
     assert_equal 'November 2008', show_month(nil, nil)
     assert_equal 'November 2008', show_month('', '')
   end
 
   should 'show next month' do
-    expects(:_).with('November').returns('November').at_least_once
-    expects(:_).with('%{month} %{year}').returns('%{month} %{year}').at_least_once
     assert_equal 'November 2009', show_month(2009, 10, :next => true)
   end
 
   should 'show previous month' do
-    expects(:_).with('September').returns('September').at_least_once
-    expects(:_).with('%{month} %{year}').returns('%{month} %{year}').at_least_once
     assert_equal 'September 2009', show_month(2009, 10, :previous => true)
   end
 
   should 'provide an intertionalized date selector pass month names' do
-    expects(:gettext).with('January').returns('January')
-    expects(:gettext).with('February').returns('February')
-    expects(:gettext).with('March').returns('March')
-    expects(:gettext).with('April').returns('April')
-    expects(:gettext).with('May').returns('May')
-    expects(:gettext).with('June').returns('June')
-    expects(:gettext).with('July').returns('July')
-    expects(:gettext).with('August').returns('August')
-    expects(:gettext).with('September').returns('September')
-    expects(:gettext).with('October').returns('October')
-    expects(:gettext).with('November').returns('November')
-    expects(:gettext).with('December').returns('December')
     expects(:language).returns('en')
-
-    expects(:date_select).with(:object, :method, { :include_blank => true, :order => [:month, :day, :year], :use_month_names => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']}).returns("KKKKKKKK")
-
+    expects(:date_select).with(:object, :method, { :include_blank => true, :order => [:month, :day, :year], :use_month_names => MONTHS }).returns("KKKKKKKK")
     assert_equal 'KKKKKKKK', pick_date(:object, :method)
   end
 
   should 'order date in english like month day year' do
-    expects(:language).returns("en")
-    expects(:date_select).with(:object, :method, { :include_blank => true, :order => [:month, :day, :year], :use_month_names => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']}).returns("KKKKKKKK")
+    expects(:language).returns('en')
+    expects(:date_select).with(:object, :method, { :include_blank => true, :order => [:month, :day, :year], :use_month_names => MONTHS }).returns("KKKKKKKK")
 
     assert_equal 'KKKKKKKK', pick_date(:object, :method)
   end
 
   should 'order date in other languages like day month year' do
     expects(:language).returns('pt_BR')
-    expects(:date_select).with(:object, :method, { :include_blank => true, :order => [:day, :month, :year], :use_month_names => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']}).returns("KKKKKKKK")
+    expects(:date_select).with(:object, :method, { :include_blank => true, :order => [:day, :month, :year], :use_month_names => MONTHS }).returns("KKKKKKKK")
 
     assert_equal 'KKKKKKKK', pick_date(:object, :method)
   end
@@ -151,9 +127,7 @@ class DatesHelperTest < ActiveSupport::TestCase
 
   should 'translate time' do
     time = Time.parse('25 May 2009, 12:47')
-    expects(:_).with('%{day} %{month} %{year}, %{hour}:%{minutes}').returns('translated time')
-    stubs(:_).with('May').returns("Maio")
-    assert_equal 'translated time', show_time(time)
+    assert_equal '25 May 2009, 12:47', show_time(time)
   end
 
   should 'handle nil time' do

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listas.softwarelivre.org/pipermail/noosfero-dev/attachments/20150212/22c0c43c/attachment-0001.html>


More information about the Noosfero-dev mailing list