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