Controle de versoes para noticias e eventos

master
Alinson S. Xavier 18 years ago
parent 4c55ce7b45
commit 104902919b

@ -30,6 +30,7 @@ class EventsController < ApplicationController
end end
def show def show
@event.revert_to(params[:version]) if params[:version]
respond_to do |format| respond_to do |format|
format.html format.html
format.xml { render :xml => @event } format.xml { render :xml => @event }
@ -46,7 +47,7 @@ class EventsController < ApplicationController
@event.save! @event.save!
flash[:notice] = 'Event created'[] 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| respond_to do |format|
format.html { redirect_to course_event_path(@course, @event) } format.html { redirect_to course_event_path(@course, @event) }
@ -55,14 +56,16 @@ class EventsController < ApplicationController
end end
def edit def edit
@event.revert_to(params[:version]) if params[:version]
end end
def update def update
@event.attributes = params[:event] @event.attributes = params[:event]
dirty = @event.dirty?
@event.save! @event.save!
flash[:notice] = 'Event updated'[] 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| respond_to do |format|
format.html { redirect_to course_event_path(@course, @event) } format.html { redirect_to course_event_path(@course, @event) }
@ -75,7 +78,7 @@ class EventsController < ApplicationController
flash[:notice] = 'Event removed'[] flash[:notice] = 'Event removed'[]
flash[:undo] = undelete_course_event_url(@course, @event) 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| respond_to do |format|
format.html { redirect_to course_events_path(@course) } format.html { redirect_to course_events_path(@course) }
@ -97,10 +100,10 @@ class EventsController < ApplicationController
def undelete def undelete
@event = Event.find_with_deleted(params[:id]) @event = Event.find_with_deleted(params[:id])
@event.update_attribute(:deleted_at, nil) @event.restore!
flash[:notice] = "Event restored"[]
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| respond_to do |format|
format.html { redirect_to course_event_url(@event.course, @event) } format.html { redirect_to course_event_url(@event.course, @event) }

@ -33,6 +33,7 @@ class NewsController < ApplicationController
end end
def show def show
@news.revert_to(params[:version]) if params[:version]
respond_to do |format| respond_to do |format|
format.html format.html
format.xml { render :xml => @news } format.xml { render :xml => @news }
@ -49,7 +50,7 @@ class NewsController < ApplicationController
@news.save! @news.save!
flash[:notice] = 'News created'[] 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| respond_to do |format|
format.html { redirect_to course_news_path(@course, @news) } format.html { redirect_to course_news_path(@course, @news) }
@ -58,14 +59,17 @@ class NewsController < ApplicationController
end end
def edit def edit
@news.revert_to(params[:version]) if params[:version]
end end
def update def update
@news.attributes = params[:news] @news.attributes = params[:news]
@news.timestamp = Time.now.utc
dirty = @news.dirty?
@news.save! @news.save!
flash[:notice] = 'News updated'[] 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| respond_to do |format|
format.html { redirect_to course_news_path(@course, @news) } format.html { redirect_to course_news_path(@course, @news) }
@ -78,7 +82,7 @@ class NewsController < ApplicationController
flash[:notice] = 'News removed'[] flash[:notice] = 'News removed'[]
flash[:undo] = undelete_course_news_url(@course, @news) 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| respond_to do |format|
format.html { redirect_to course_news_index_path(@course) } format.html { redirect_to course_news_index_path(@course) }
@ -88,10 +92,10 @@ class NewsController < ApplicationController
def undelete def undelete
@news = News.find_with_deleted(params[:id]) @news = News.find_with_deleted(params[:id])
@news.update_attribute(:deleted_at, nil) @news.restore!
flash[:notice] = "News restored"[]
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| respond_to do |format|
format.html { redirect_to course_news_url(@news.course, @news) } format.html { redirect_to course_news_url(@news.course, @news) }

@ -18,6 +18,8 @@ class Event < ActiveRecord::Base
# Plugins # Plugins
acts_as_paranoid acts_as_paranoid
acts_as_versioned :if_changed => [ :title, :description, :time ]
self.non_versioned_fields << 'deleted_at'
# Associacoes # Associacoes
belongs_to :course belongs_to :course

@ -25,8 +25,8 @@ class EventDeleteLogEntry < EventLogEntry
event.deleted? event.deleted?
end end
def undo!(current_user) def undo!(current_user)
event.update_attribute(:deleted_at, nil) event.restore!
EventRestoreLogEntry.create!(:target_id => event.id, :user_id => current_user.id, :course => event.course) EventRestoreLogEntry.create!(:target_id => event.id, :user_id => current_user.id, :course => event.course, :version => event.version)
end end
end end

@ -25,8 +25,8 @@ class NewsDeleteLogEntry < NewsLogEntry
news.deleted? news.deleted?
end end
def undo!(current_user) def undo!(current_user)
news.update_attribute(:deleted_at, nil) news.restore!
NewsRestoreLogEntry.create!(:target_id => news.id, :user_id => current_user.id, :course => news.course) NewsRestoreLogEntry.create!(:target_id => news.id, :user_id => current_user.id, :course => news.course, :version => news.version)
end end
end end

@ -18,6 +18,8 @@ class Message < ActiveRecord::Base
# Plugins # Plugins
acts_as_paranoid acts_as_paranoid
acts_as_versioned :if_changed => [ :title, :body ]
self.non_versioned_fields << 'deleted_at'
# Associacoes # Associacoes
belongs_to :user, belongs_to :user,

@ -14,6 +14,9 @@
- if !@events.empty? - if !@events.empty?
%table %table
- @events.each do |event| - @events.each do |event|
- event.revert_to(params[:version]) if (event.id == params[:id].to_i) and (params[:version])
%tr[event] %tr[event]
%td.top.aright{:width => '1%'} %td.top.aright{:width => '1%'}
= event.time.strftime("%d&nbsp;de&nbsp;%B") #unless event.time == last_date = event.time.strftime("%d&nbsp;de&nbsp;%B") #unless event.time == last_date
@ -23,7 +26,7 @@
.title=link_to h(event.title), course_event_url(@course, event) .title=link_to h(event.title), course_event_url(@course, event)
.description{:style => (event.id == params[:id].to_i ? '' : 'display: none')} .description{:style => (event.id == params[:id].to_i ? '' : 'display: none')}
%div.cmd %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 = action_icon 'trash', 'Excluir', course_event_url(@course, event), :confirm => 'Tem certeza que deseja excluir?', :method => :delete
= formatted(event.description) = formatted(event.description)
= "Sem descrição" if event.description.empty? = "Sem descrição" if event.description.empty?

@ -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) = "criado " if entry.kind_of?(EventCreateLogEntry)
= "editado " if entry.kind_of?(EventEditLogEntry) = "editado " if entry.kind_of?(EventEditLogEntry)

@ -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) = "criada " if entry.kind_of?(NewsCreateLogEntry)
= "editada " if entry.kind_of?(NewsEditLogEntry) = "editada " if entry.kind_of?(NewsEditLogEntry)

@ -14,6 +14,9 @@
- if !@course.news.empty? - if !@course.news.empty?
%table %table
- @course.news.each do |n| - @course.news.each do |n|
- n.revert_to(params[:version]) if (n.id == params[:id].to_i) and (params[:version])
%tr[n] %tr[n]
%td.top.aright{:width => '1%'} %td.top.aright{:width => '1%'}
= n.timestamp.strftime("%d&nbsp;de&nbsp;%B") = n.timestamp.strftime("%d&nbsp;de&nbsp;%B")
@ -21,7 +24,7 @@
.title= link_to h(n.title), course_news_url(@course, n) .title= link_to h(n.title), course_news_url(@course, n)
.description{:style => (n.id == params[:id].to_i ? '' : 'display: none')} .description{:style => (n.id == params[:id].to_i ? '' : 'display: none')}
.cmd .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 = action_icon 'trash', 'Excluir', course_news_url(@course, n), :confirm => 'Tem certeza que deseja excluir?', :method => :delete
= formatted(n.body) = formatted(n.body)
= "Sem descrição" if n.body.empty? = "Sem descrição" if n.body.empty?

@ -1,5 +1,5 @@
%h4.title= @course.full_name %h4.title= @course.full_name
%h1.title Adicionar evento %h1.title Adicionar notícia
- form_tag course_news_url(@course, @news), :method => :post do - form_tag course_news_url(@course, @news), :method => :post do
= render :partial => 'form' = render :partial => 'form'

@ -9,7 +9,7 @@
# #
# It's strongly recommended to check this file into your version control system. # 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| create_table "attachments", :force => true do |t|
t.string "file_name", :null => false t.string "file_name", :null => false
@ -37,6 +37,18 @@ ActiveRecord::Schema.define(:version => 33) do
t.integer "course_id" t.integer "course_id"
end 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| create_table "events", :force => true do |t|
t.string "title", :null => false t.string "title", :null => false
t.integer "created_by", :null => false t.integer "created_by", :null => false
@ -44,6 +56,7 @@ ActiveRecord::Schema.define(:version => 33) do
t.text "description" t.text "description"
t.datetime "deleted_at" t.datetime "deleted_at"
t.datetime "time", :default => '2008-03-05 04:25:27', :null => false t.datetime "time", :default => '2008-03-05 04:25:27', :null => false
t.integer "version", :default => 1, :null => false
end end
create_table "log_entries", :force => true do |t| create_table "log_entries", :force => true do |t|
@ -56,14 +69,28 @@ ActiveRecord::Schema.define(:version => 33) do
t.datetime "deleted_at" t.datetime "deleted_at"
end 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| create_table "messages", :force => true do |t|
t.string "title" t.string "title"
t.text "body", :null => false t.text "body", :null => false
t.datetime "timestamp", :null => false t.datetime "timestamp", :null => false
t.integer "receiver_id" t.integer "receiver_id"
t.integer "sender_id", :null => false t.integer "sender_id", :null => false
t.string "type" t.string "type"
t.datetime "deleted_at" t.datetime "deleted_at"
t.integer "version", :default => 1, :null => false
end end
create_table "sessions", :force => true do |t| create_table "sessions", :force => true do |t|

@ -19,8 +19,12 @@ require File.dirname(__FILE__) + '/../test_helper'
class MessageTest < Test::Unit::TestCase class MessageTest < Test::Unit::TestCase
fixtures :messages fixtures :messages
# Replace this with your real tests. def test_should_not_create_new_version
def test_truth news = News.find(1)
assert true news.destroy
end
news = News.find_with_deleted(1)
news.restore!
assert !news.dirty?
end
end end

@ -280,7 +280,7 @@ module ActiveRecord #:nodoc:
end end
def previous_version(current_version = self.version) 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 end
protected protected

@ -142,6 +142,12 @@ module Caboose #:nodoc:
def deleted? def deleted?
!!read_attribute(:deleted_at) !!read_attribute(:deleted_at)
end end
def restore!
self.deleted_at = nil
self.save!
end
end end
end end
end end