From 104902919bb42a854afc25861cce6c62491d329b Mon Sep 17 00:00:00 2001 From: Alinson Santos Date: Tue, 18 Mar 2008 05:34:13 -0300 Subject: [PATCH] Controle de versoes para noticias e eventos --- app/controllers/events_controller.rb | 15 ++++---- app/controllers/news_controller.rb | 16 +++++---- app/models/event.rb | 2 ++ app/models/log_entry/event_log_entry.rb | 4 +-- app/models/log_entry/news_log_entry.rb | 4 +-- app/models/message.rb | 2 ++ app/views/events/index.html.haml | 5 ++- app/views/log/_event_log_entry.html.haml | 2 +- app/views/log/_news_log_entry.html.haml | 2 +- app/views/news/index.html.haml | 5 ++- app/views/news/new.html.haml | 2 +- db/schema.rb | 35 ++++++++++++++++--- test/unit/message_test.rb | 12 ++++--- .../lib/acts_as_versioned.rb | 2 +- .../lib/caboose/acts/paranoid.rb | 6 ++++ 15 files changed, 84 insertions(+), 30 deletions(-) diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index 687a8f2..8af32c1 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -30,6 +30,7 @@ class EventsController < ApplicationController end def show + @event.revert_to(params[:version]) if params[:version] respond_to do |format| format.html format.xml { render :xml => @event } @@ -46,7 +47,7 @@ class EventsController < ApplicationController @event.save! flash[:notice] = 'Event created'[] - EventCreateLogEntry.create!(:target_id => @event.id, :user => @current_user, :course => @course) + EventCreateLogEntry.create!(:target_id => @event.id, :user => @current_user, :course => @course, :version => @event.version) respond_to do |format| format.html { redirect_to course_event_path(@course, @event) } @@ -55,14 +56,16 @@ class EventsController < ApplicationController end def edit + @event.revert_to(params[:version]) if params[:version] end def update @event.attributes = params[:event] + dirty = @event.dirty? @event.save! flash[:notice] = 'Event updated'[] - EventEditLogEntry.create!(:target_id => @event.id, :user => @current_user, :course => @course) + EventEditLogEntry.create!(:target_id => @event.id, :user => @current_user, :course => @course, :version => @event.version) if dirty respond_to do |format| format.html { redirect_to course_event_path(@course, @event) } @@ -75,7 +78,7 @@ class EventsController < ApplicationController flash[:notice] = 'Event removed'[] flash[:undo] = undelete_course_event_url(@course, @event) - EventDeleteLogEntry.create!(:target_id => @event.id, :user => @current_user, :course => @course) + EventDeleteLogEntry.create!(:target_id => @event.id, :user => @current_user, :course => @course, :version => @event.version) respond_to do |format| format.html { redirect_to course_events_path(@course) } @@ -97,10 +100,10 @@ class EventsController < ApplicationController def undelete @event = Event.find_with_deleted(params[:id]) - @event.update_attribute(:deleted_at, nil) - flash[:notice] = "Event restored"[] + @event.restore! - EventRestoreLogEntry.create!(:target_id => @event.id, :user => @current_user, :course => @event.course) + flash[:notice] = "Event restored"[] + EventRestoreLogEntry.create!(:target_id => @event.id, :user => @current_user, :course => @event.course, :version => @event.version) respond_to do |format| format.html { redirect_to course_event_url(@event.course, @event) } diff --git a/app/controllers/news_controller.rb b/app/controllers/news_controller.rb index ec31172..71e3a98 100644 --- a/app/controllers/news_controller.rb +++ b/app/controllers/news_controller.rb @@ -33,6 +33,7 @@ class NewsController < ApplicationController end def show + @news.revert_to(params[:version]) if params[:version] respond_to do |format| format.html format.xml { render :xml => @news } @@ -49,7 +50,7 @@ class NewsController < ApplicationController @news.save! flash[:notice] = 'News created'[] - NewsCreateLogEntry.create!(:target_id => @news.id, :user => @current_user, :course => @course) + NewsCreateLogEntry.create!(:target_id => @news.id, :user => @current_user, :course => @course, :version => @news.version) respond_to do |format| format.html { redirect_to course_news_path(@course, @news) } @@ -58,14 +59,17 @@ class NewsController < ApplicationController end def edit + @news.revert_to(params[:version]) if params[:version] end def update @news.attributes = params[:news] + @news.timestamp = Time.now.utc + dirty = @news.dirty? @news.save! flash[:notice] = 'News updated'[] - NewsEditLogEntry.create!(:target_id => @news.id, :user => @current_user, :course => @course) + NewsEditLogEntry.create!(:target_id => @news.id, :user => @current_user, :course => @course, :version => @news.version) if dirty respond_to do |format| format.html { redirect_to course_news_path(@course, @news) } @@ -78,7 +82,7 @@ class NewsController < ApplicationController flash[:notice] = 'News removed'[] flash[:undo] = undelete_course_news_url(@course, @news) - NewsDeleteLogEntry.create!(:target_id => @news.id, :user => @current_user, :course => @course) + NewsDeleteLogEntry.create!(:target_id => @news.id, :user => @current_user, :course => @course, :version => @news.version) respond_to do |format| format.html { redirect_to course_news_index_path(@course) } @@ -88,10 +92,10 @@ class NewsController < ApplicationController def undelete @news = News.find_with_deleted(params[:id]) - @news.update_attribute(:deleted_at, nil) - flash[:notice] = "News restored"[] + @news.restore! - NewsRestoreLogEntry.create!(:target_id => @news.id, :user => @current_user, :course => @news.course) + flash[:notice] = "News restored"[] + NewsRestoreLogEntry.create!(:target_id => @news.id, :user => @current_user, :course => @news.course, :version => @news.version) respond_to do |format| format.html { redirect_to course_news_url(@news.course, @news) } diff --git a/app/models/event.rb b/app/models/event.rb index cf6916e..e93efdc 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -18,6 +18,8 @@ class Event < ActiveRecord::Base # Plugins acts_as_paranoid + acts_as_versioned :if_changed => [ :title, :description, :time ] + self.non_versioned_fields << 'deleted_at' # Associacoes belongs_to :course diff --git a/app/models/log_entry/event_log_entry.rb b/app/models/log_entry/event_log_entry.rb index 45d1731..836d4af 100644 --- a/app/models/log_entry/event_log_entry.rb +++ b/app/models/log_entry/event_log_entry.rb @@ -25,8 +25,8 @@ class EventDeleteLogEntry < EventLogEntry event.deleted? end def undo!(current_user) - event.update_attribute(:deleted_at, nil) - EventRestoreLogEntry.create!(:target_id => event.id, :user_id => current_user.id, :course => event.course) + event.restore! + EventRestoreLogEntry.create!(:target_id => event.id, :user_id => current_user.id, :course => event.course, :version => event.version) end end diff --git a/app/models/log_entry/news_log_entry.rb b/app/models/log_entry/news_log_entry.rb index c0196eb..24e6f3e 100644 --- a/app/models/log_entry/news_log_entry.rb +++ b/app/models/log_entry/news_log_entry.rb @@ -25,8 +25,8 @@ class NewsDeleteLogEntry < NewsLogEntry news.deleted? end def undo!(current_user) - news.update_attribute(:deleted_at, nil) - NewsRestoreLogEntry.create!(:target_id => news.id, :user_id => current_user.id, :course => news.course) + news.restore! + NewsRestoreLogEntry.create!(:target_id => news.id, :user_id => current_user.id, :course => news.course, :version => news.version) end end diff --git a/app/models/message.rb b/app/models/message.rb index 034fe45..2d2e88d 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -18,6 +18,8 @@ class Message < ActiveRecord::Base # Plugins acts_as_paranoid + acts_as_versioned :if_changed => [ :title, :body ] + self.non_versioned_fields << 'deleted_at' # Associacoes belongs_to :user, diff --git a/app/views/events/index.html.haml b/app/views/events/index.html.haml index 988fd8f..b7679e8 100644 --- a/app/views/events/index.html.haml +++ b/app/views/events/index.html.haml @@ -14,6 +14,9 @@ - if !@events.empty? %table - @events.each do |event| + + - event.revert_to(params[:version]) if (event.id == params[:id].to_i) and (params[:version]) + %tr[event] %td.top.aright{:width => '1%'} = event.time.strftime("%d de %B") #unless event.time == last_date @@ -23,7 +26,7 @@ .title=link_to h(event.title), course_event_url(@course, event) .description{:style => (event.id == params[:id].to_i ? '' : 'display: none')} %div.cmd - = action_icon 'edit', 'Editar', edit_course_event_url(@course, event) + = action_icon 'edit', 'Editar', edit_course_event_url(@course, event, :version => event.version) = action_icon 'trash', 'Excluir', course_event_url(@course, event), :confirm => 'Tem certeza que deseja excluir?', :method => :delete = formatted(event.description) = "Sem descrição" if event.description.empty? diff --git a/app/views/log/_event_log_entry.html.haml b/app/views/log/_event_log_entry.html.haml index 95d6743..9b5934b 100644 --- a/app/views/log/_event_log_entry.html.haml +++ b/app/views/log/_event_log_entry.html.haml @@ -1,4 +1,4 @@ -= "Evento " + link_to(h(entry.event.title), course_event_url(entry.course, entry.event)) += "Evento " + link_to(h(entry.event.title), course_event_url(entry.course, entry.event, :version => entry.version)) = "criado " if entry.kind_of?(EventCreateLogEntry) = "editado " if entry.kind_of?(EventEditLogEntry) diff --git a/app/views/log/_news_log_entry.html.haml b/app/views/log/_news_log_entry.html.haml index 1e4eeb3..4e62139 100644 --- a/app/views/log/_news_log_entry.html.haml +++ b/app/views/log/_news_log_entry.html.haml @@ -1,4 +1,4 @@ -= "Notícia " + link_to(h(entry.news.title), course_news_url(entry.course, entry.news)) += "Notícia " + link_to(h(entry.news.title), course_news_url(entry.course, entry.news, :version => entry.version)) = "criada " if entry.kind_of?(NewsCreateLogEntry) = "editada " if entry.kind_of?(NewsEditLogEntry) diff --git a/app/views/news/index.html.haml b/app/views/news/index.html.haml index 11822c3..577c144 100644 --- a/app/views/news/index.html.haml +++ b/app/views/news/index.html.haml @@ -14,6 +14,9 @@ - if !@course.news.empty? %table - @course.news.each do |n| + + - n.revert_to(params[:version]) if (n.id == params[:id].to_i) and (params[:version]) + %tr[n] %td.top.aright{:width => '1%'} = n.timestamp.strftime("%d de %B") @@ -21,7 +24,7 @@ .title= link_to h(n.title), course_news_url(@course, n) .description{:style => (n.id == params[:id].to_i ? '' : 'display: none')} .cmd - = action_icon 'edit', 'Editar', edit_course_news_url(@course, n) + = action_icon 'edit', 'Editar', edit_course_news_url(@course, n, :version => n.version) = action_icon 'trash', 'Excluir', course_news_url(@course, n), :confirm => 'Tem certeza que deseja excluir?', :method => :delete = formatted(n.body) = "Sem descrição" if n.body.empty? diff --git a/app/views/news/new.html.haml b/app/views/news/new.html.haml index 6de7020..976a34b 100644 --- a/app/views/news/new.html.haml +++ b/app/views/news/new.html.haml @@ -1,5 +1,5 @@ %h4.title= @course.full_name -%h1.title Adicionar evento +%h1.title Adicionar notícia - form_tag course_news_url(@course, @news), :method => :post do = render :partial => 'form' diff --git a/db/schema.rb b/db/schema.rb index a370c8a..54812d4 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 => 33) do +ActiveRecord::Schema.define(:version => 34) do create_table "attachments", :force => true do |t| t.string "file_name", :null => false @@ -37,6 +37,18 @@ ActiveRecord::Schema.define(:version => 33) do t.integer "course_id" end + create_table "event_versions", :force => true do |t| + t.integer "event_id" + t.integer "version" + t.string "title" + t.integer "created_by" + t.integer "course_id", :default => 0 + t.text "description" + t.datetime "deleted_at" + t.datetime "time", :default => '2008-03-05 04:25:27' + t.datetime "updated_at" + end + create_table "events", :force => true do |t| t.string "title", :null => false t.integer "created_by", :null => false @@ -44,6 +56,7 @@ ActiveRecord::Schema.define(:version => 33) do t.text "description" t.datetime "deleted_at" t.datetime "time", :default => '2008-03-05 04:25:27', :null => false + t.integer "version", :default => 1, :null => false end create_table "log_entries", :force => true do |t| @@ -56,14 +69,28 @@ ActiveRecord::Schema.define(:version => 33) do t.datetime "deleted_at" end + create_table "message_versions", :force => true do |t| + t.integer "message_id" + t.integer "version" + t.string "title" + t.text "body" + t.datetime "timestamp" + t.integer "receiver_id" + t.integer "sender_id" + t.datetime "deleted_at" + t.string "versioned_type" + t.datetime "updated_at" + end + create_table "messages", :force => true do |t| t.string "title" - t.text "body", :null => false - t.datetime "timestamp", :null => false + t.text "body", :null => false + t.datetime "timestamp", :null => false t.integer "receiver_id" - t.integer "sender_id", :null => false + t.integer "sender_id", :null => false t.string "type" t.datetime "deleted_at" + t.integer "version", :default => 1, :null => false end create_table "sessions", :force => true do |t| diff --git a/test/unit/message_test.rb b/test/unit/message_test.rb index 0fe70ba..a58d3d7 100644 --- a/test/unit/message_test.rb +++ b/test/unit/message_test.rb @@ -19,8 +19,12 @@ require File.dirname(__FILE__) + '/../test_helper' class MessageTest < Test::Unit::TestCase fixtures :messages - # Replace this with your real tests. - def test_truth - assert true - end + def test_should_not_create_new_version + news = News.find(1) + news.destroy + + news = News.find_with_deleted(1) + news.restore! + assert !news.dirty? + end end diff --git a/vendor/gems/acts_as_versioned-0.2.3/lib/acts_as_versioned.rb b/vendor/gems/acts_as_versioned-0.2.3/lib/acts_as_versioned.rb index 9b81912..eb5a70c 100644 --- a/vendor/gems/acts_as_versioned-0.2.3/lib/acts_as_versioned.rb +++ b/vendor/gems/acts_as_versioned-0.2.3/lib/acts_as_versioned.rb @@ -280,7 +280,7 @@ module ActiveRecord #:nodoc: end def previous_version(current_version = self.version) - self.versions.find(:first, :conditions => [ 'version < ?', current_version ], :order => 'version desc') + self.versions.find(:first, :conditions => [ 'version < ?', current_version ], :order => 'version desc') end protected diff --git a/vendor/plugins/acts_as_paranoid/lib/caboose/acts/paranoid.rb b/vendor/plugins/acts_as_paranoid/lib/caboose/acts/paranoid.rb index 1a058c1..892716f 100644 --- a/vendor/plugins/acts_as_paranoid/lib/caboose/acts/paranoid.rb +++ b/vendor/plugins/acts_as_paranoid/lib/caboose/acts/paranoid.rb @@ -142,6 +142,12 @@ module Caboose #:nodoc: def deleted? !!read_attribute(:deleted_at) end + + def restore! + self.deleted_at = nil + self.save! + end + end end end