From e5bc6024ba1c8e8b90bb2c1ddcb5dbee1c979139 Mon Sep 17 00:00:00 2001 From: Alinson Santos Date: Wed, 5 Mar 2008 06:52:52 -0300 Subject: [PATCH] Dashboard agora com rss e ical --- app/controllers/events_controller.rb | 2 +- app/controllers/log_controller.rb | 2 ++ app/controllers/users_controller.rb | 23 ++++++++++++++++++----- app/models/log_entry.rb | 15 +++++++++++++++ app/models/user.rb | 3 +++ app/views/layouts/base.html.haml | 2 +- app/views/log/index.html.haml | 9 +++------ app/views/stylesheets/color.css.erb | 5 ----- app/views/stylesheets/wiki.css.erb | 22 +++++++++++----------- app/views/users/dashboard.html.haml | 13 +++++++++---- app/views/users/dashboard.rss.builder | 18 ++++++++++++++++++ config/routes.rb | 3 ++- db/migrate/030_user_secret.rb | 13 +++++++++++++ db/schema.rb | 3 ++- lang/pt-br.yml | 3 +++ 15 files changed, 101 insertions(+), 35 deletions(-) create mode 100644 app/views/users/dashboard.rss.builder create mode 100644 db/migrate/030_user_secret.rb diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index d4bc843..39342f8 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -41,7 +41,7 @@ class EventsController < ApplicationController @event.created_by = session[:user_id] @event.save! flash[:notice] = 'Event created'[] - + EventCreateLogEntry.create!(:target_id => @event.id, :user => @current_user, :course => @course) respond_to do |format| diff --git a/app/controllers/log_controller.rb b/app/controllers/log_controller.rb index e853746..e43c735 100644 --- a/app/controllers/log_controller.rb +++ b/app/controllers/log_controller.rb @@ -19,6 +19,8 @@ class LogController < ApplicationController @log_entries = @course.log_entries.find(:all, :limit => 50) #.paginate(:page => params[:page], :per_page => 30) respond_to do |format| format.html + format.rss { response.content_type = Mime::RSS } + format.xml { render :xml => @log_entries } end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 2c2507f..05829e0 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -68,7 +68,7 @@ class UsersController < ApplicationController @user.save! setup_session(@user) flash[:message] = 'User account created'[] - redirect_to user_path(@user) + redirect_to dashboard_url rescue ActiveRecord::RecordInvalid flash[:warning] = 'Não foi possível cadastrar a conta.' end @@ -82,7 +82,7 @@ class UsersController < ApplicationController @user.save! @color = @user.pref_color flash[:message] = 'Settings updated'[] - redirect_to index_path + redirect_to dashboard_url end end @@ -109,12 +109,25 @@ class UsersController < ApplicationController def dashboard @news = [] @events = [] + + if params[:format] == 'html' + return unless require_login + @user = @current_user + else + @user = User.find_by_secret(params[:secret]) + end - unless @current_user.courses.empty? - @news = News.find(:all, :conditions => [ 'receiver_id in (?)', @current_user.courses ], + unless @user.courses.empty? + @news = News.find(:all, :conditions => [ 'receiver_id in (?)', @user.courses ], :order => 'timestamp desc', :limit => 5) @events = Event.find(:all, :conditions => [ 'course_id in (?) and (time > ?) and (time < ?)', - @current_user.courses, 1.day.ago, 21.days.from_now ], :order => 'time') + @user.courses, 1.day.ago, 21.days.from_now ], :order => 'time') + end + + respond_to do |format| + format.html + format.rss { response.content_type = Mime::RSS } + format.ics { response.content_type = Mime::ICS; render :text => Event.to_ical(@user.courses) } end end diff --git a/app/models/log_entry.rb b/app/models/log_entry.rb index f1ba48d..85514b2 100644 --- a/app/models/log_entry.rb +++ b/app/models/log_entry.rb @@ -16,6 +16,21 @@ class LogEntry < ActiveRecord::Base belongs_to :course def reversible?() false end + + def to_xml(options = {}) + options[:indent] ||= 2 + xml = options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent]) + xml.instruct! unless options[:skip_instruct] + xml.log_entry do + xml.id self.id + xml.course_id self.course_id + xml.created_at self.created_at + xml.target_id self.target_id + xml.user_id self.user_id + xml.type self.type + xml.version self.version unless self.version.nil? + end + end end require 'log_entry/attachment_log_entry.rb' diff --git a/app/models/user.rb b/app/models/user.rb index 2aa00e3..fb26764 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -48,6 +48,8 @@ class User < ActiveRecord::Base xml.user do xml.id self.id xml.name self.name + xml.display_name self.display_name + xml.login self.login xml.created_at self.created_at xml.last_seen self.last_seen xml.description self.description @@ -91,6 +93,7 @@ class User < ActiveRecord::Base def before_save self.salt = User.random_string(10) if !self.salt? + self.secret = User.random_string(32) if !self.secret? self.hashed_password = User.encrypt(@password, self.salt) if !@password.blank? end diff --git a/app/views/layouts/base.html.haml b/app/views/layouts/base.html.haml index 74c061e..488b918 100644 --- a/app/views/layouts/base.html.haml +++ b/app/views/layouts/base.html.haml @@ -47,5 +47,5 @@ .content= @content %br{'style' => 'clear:both'} - #footer + #footer diff --git a/app/views/log/index.html.haml b/app/views/log/index.html.haml index a5cbc06..90acefe 100644 --- a/app/views/log/index.html.haml +++ b/app/views/log/index.html.haml @@ -1,6 +1,8 @@ %h4.title= h(@course.full_name) %h1.title Mudanças recentes += auto_discovery_link_tag :rss, formatted_course_log_url(@course, :rss) + .box %table %tr @@ -11,9 +13,4 @@ %tr %td= entry.created_at.strftime("%d/%m/%y %H:%M:%S") %td= link_to truncate(h(entry.user.display_name), 20), user_path(entry.user) - %td - = render(:partial => 'log/attachment_log_entry', :locals => { :entry => entry }) if entry.kind_of?(AttachmentLogEntry) - = render(:partial => 'log/event_log_entry', :locals => { :entry => entry }) if entry.kind_of?(EventLogEntry) - = render(:partial => 'log/news_log_entry', :locals => { :entry => entry }) if entry.kind_of?(NewsLogEntry) - = render(:partial => 'log/wiki_log_entry', :locals => { :entry => entry }) if entry.kind_of?(WikiLogEntry) - = "(" + link_to("undo", undo_course_log_url(@course, entry)) + ")" if entry.reversible? + %td= render(:partial => 'log/log_entry', :locals => { :entry => entry }) diff --git a/app/views/stylesheets/color.css.erb b/app/views/stylesheets/color.css.erb index fb04038..1b38ea9 100644 --- a/app/views/stylesheets/color.css.erb +++ b/app/views/stylesheets/color.css.erb @@ -28,11 +28,6 @@ h1, h2, h3, h4, h5, th { background-color: <%= color[0] %>; } -#footer { - background-color: <%= color[3] %>; - border-top: 5px solid <%= color[3] %>; -} - .icon img:hover { background-color: <%= color[1] %>; } diff --git a/app/views/stylesheets/wiki.css.erb b/app/views/stylesheets/wiki.css.erb index 2a97f98..0c67d83 100644 --- a/app/views/stylesheets/wiki.css.erb +++ b/app/views/stylesheets/wiki.css.erb @@ -120,13 +120,15 @@ body { font-weight: normal; min-width: 780px; - background-image: url(<%= App.base_path %>/images/bg_body.png); - background-repeat: repeat-x; - background-color: #f4f4f4; + background-color: #fff; } #wrapper { - margin: 0em auto; + margin: 0em -9px; + padding: 0px 9px; + background-image: url(<%= App.base_path %>/images/bg_body.png); + background-repeat: repeat-x; + background-color: #f4f4f4; } #header { @@ -194,16 +196,14 @@ body { #site { padding: 0px; margin-top: 18px; - border-bottom: 30px solid #eee; } #footer { - display: none; - background-image: url(<%= App.base_path %>/images/footer_bg.png); - background-position: top; - background-repeat: repeat-x; - margin: 0em; - height: 10em; + border-top: 3px solid #f0f0f0; + margin: 0px -9px; + padding: 18px 0px; + text-align: center; + color: #aaa; } .float_panel_left { diff --git a/app/views/users/dashboard.html.haml b/app/views/users/dashboard.html.haml index 2cf70c6..ccd183f 100644 --- a/app/views/users/dashboard.html.haml +++ b/app/views/users/dashboard.html.haml @@ -1,15 +1,18 @@ %h4.title Dashboard %h1.title= "Bem vindo, #{h(@current_user.display_name)}" += auto_discovery_link_tag :rss, formatted_dashboard_url(:secret => @current_user.secret, :format => 'rss') + .dashboard .box + .cmd + =link_to "rss", formatted_dashboard_url(:secret => @current_user.secret, :format => 'rss') - last_time = nil - %h3 Notícias Recentes + %h3 Notícias Recentes - if @news.empty? %ul %li.no_itens Nenhum notícia recente - %table - @news.each do |n| %tr @@ -22,13 +25,14 @@ %p= h(n.body) .box + .cmd + =link_to "ical", formatted_dashboard_url(:secret => @current_user.secret, :format => 'ics') - last_time = nil - %h3 Próximos Eventos + %h3 Próximos Eventos - if @events.empty? %ul %li.no_itens Nenhum evento próximo - %table - @events.each do |n| %tr @@ -49,3 +53,4 @@ - @current_user.courses.each do |course| %li= link_to(h(course.full_name), course_url(course)) + diff --git a/app/views/users/dashboard.rss.builder b/app/views/users/dashboard.rss.builder new file mode 100644 index 0000000..9b5765f --- /dev/null +++ b/app/views/users/dashboard.rss.builder @@ -0,0 +1,18 @@ +xml.instruct! :xml, :version=>"1.0" +xml.rss(:version=>"2.0") do + xml.channel do + xml.title("#{App.title} - " + "News"[].titleize) + xml.link(dashboard_url) + xml.language(App.language) + xml.description("{app} news"[:news_about, App.title]) + for news_item in @news + xml.item do + xml.title(news_item.course.short_name + ": " + news_item.title) + xml.description(news_item.body) + xml.pubDate(news_item.timestamp.rfc2822) + xml.link(course_news_url(news_item.course, news_item)) + xml.guid(course_news_url(news_item.course, news_item)) + end + end + end +end diff --git a/config/routes.rb b/config/routes.rb index 3df3dd1..da33f32 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -71,7 +71,8 @@ ActionController::Routing::Routes.draw do |map| end # Pagina pessoal - map.dashboard '/dashboard', :controller => 'users', :action => 'dashboard' + map.dashboard '/dashboard', :controller => 'users', :action => 'dashboard', :format => 'html' + map.formatted_dashboard '/dashboard/:secret.:format', :controller => 'users', :action => 'dashboard' # Stylesheets map.connect 'stylesheets/:action.:format', :controller => 'stylesheets' diff --git a/db/migrate/030_user_secret.rb b/db/migrate/030_user_secret.rb new file mode 100644 index 0000000..4219b49 --- /dev/null +++ b/db/migrate/030_user_secret.rb @@ -0,0 +1,13 @@ +class UserSecret < ActiveRecord::Migration + def self.up + add_column :users, :secret, :string, :null => true + User.find(:all).each do |user| + user.update_attribute(:secret, User.random_string(32)) + end + change_column :users, :secret, :string, :null => false + end + + def self.down + remove_column :users, :secret + end +end diff --git a/db/schema.rb b/db/schema.rb index 030eb6e..648017b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -9,7 +9,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 29) do +ActiveRecord::Schema.define(:version => 30) do create_table "attachments", :force => true do |t| t.string "file_name", :null => false @@ -87,6 +87,7 @@ ActiveRecord::Schema.define(:version => 29) do t.datetime "last_seen", :null => false t.string "login_key" t.boolean "admin", :default => false, :null => false + t.string "secret", :null => false end create_table "wiki_page_versions", :force => true do |t| diff --git a/lang/pt-br.yml b/lang/pt-br.yml index 1d8820a..e3d2fb7 100644 --- a/lang/pt-br.yml +++ b/lang/pt-br.yml @@ -35,6 +35,9 @@ wiki_page_removed: Página wiki removida wiki_page_updated: Página wiki atualizada wiki_page_restored: Página wiki restaurada +recent_changes: Mudanças recentes +log_about: Mudanças recentes em {disciplina} + undo: Desfazer login_required: É necessário fazer login para acessar esta área do site