fix revision count and drop observers

This commit is contained in:
shlok007 2017-01-04 22:27:46 -05:00 committed by Shlok Srivastava
parent 518ecc3d4e
commit b33e9ed28e
12 changed files with 69 additions and 34 deletions

View file

@ -22,9 +22,6 @@ gem 'responders', '~> 2.0'
gem 'mysql2'
# gem 'pg'
# for observing records
gem 'rails-observers'
# for tracking data changes
gem 'paper_trail'

View file

@ -399,8 +399,6 @@ GEM
rails-i18n (4.0.8)
i18n (~> 0.7)
railties (~> 4.0)
rails-observers (0.1.2)
activemodel (~> 4.0)
rails_12factor (0.0.3)
rails_serve_static_assets
rails_stdout_logging
@ -632,7 +630,6 @@ DEPENDENCIES
rails-assets-trianglify!
rails-assets-waypoints!
rails-i18n (~> 4.0.0)
rails-observers
rails_12factor
rdoc-generator-fivefish
redcarpet

View file

@ -0,0 +1,11 @@
module RevisionCount
extend ActiveSupport::Concern
included do
after_update :increment_revision
end
def increment_revision
conference.update_column(:revision, conference.revision + 1)
end
end

View file

@ -1,4 +1,5 @@
class Conference < ActiveRecord::Base
include RevisionCount
require 'uri'
serialize :events_per_week, Hash
# Needed to call 'Conference.with_role' in /models/ability.rb
@ -734,6 +735,15 @@ class Conference < ActiveRecord::Base
(start_hour..(end_hour - 1)).cover?(current_hour) ? current_hour - start_hour : 0
end
##
# Return the current conference object to be used in RevisionCount
#
# ====Returns
# * +ActiveRecord+
def conference
self
end
private
# Returns a different html colour for every i and consecutive colors are

View file

@ -1,5 +1,6 @@
class Event < ActiveRecord::Base
include ActiveRecord::Transitions
include RevisionCount
has_paper_trail on: [:create, :update], ignore: [:updated_at, :guid, :week], meta: { conference_id: :conference_id }
acts_as_commentable
@ -251,6 +252,10 @@ class Event < ActiveRecord::Base
event_schedules.find_by(schedule_id: program.selected_schedule_id).try(:start_time)
end
def conference
program.conference
end
private
##

View file

@ -1,26 +0,0 @@
#
# suseconferenceclient relies on a 'revision' attribute for caching and
# doing some calculations.
#
# It should be incremented after any change in the conference or in any
# associated models
#
# This observer updates the revision column in a non-intrusive way,
# preventing validations, callbacks or exceptions to be triggered
#
# Relying on paper_trail could also be an option, but a 'revision' column
# in table 'conferences' looks like a more simple and straightforward solution
#
class RevisionObserver < ActiveRecord::Observer
observe :conference, :event, :room, :track
def after_save(model)
begin
conference = model.kind_of?(Conference) ? model : model.conference
conference.reload.increment(:revision)
conference.update_column(:revision, conference.revision)
rescue
nil
end
end
end

View file

@ -1,4 +1,5 @@
class Room < ActiveRecord::Base
include RevisionCount
belongs_to :venue
has_many :event_schedules, dependent: :destroy
@ -10,6 +11,10 @@ class Room < ActiveRecord::Base
validates :size, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
def conference
venue.conference
end
private
def generate_guid

View file

@ -1,4 +1,5 @@
class Track < ActiveRecord::Base
include RevisionCount
belongs_to :program
has_many :events, dependent: :nullify
@ -16,6 +17,10 @@ class Track < ActiveRecord::Base
before_validation :capitalize_color
def conference
program.conference
end
private
def generate_guid

View file

@ -25,7 +25,6 @@ module Osem
# Activate observers that should always be running.
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
config.active_record.observers = :revision_observer
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.

View file

@ -0,0 +1,5 @@
class AddDefaultToRevisionInConference < ActiveRecord::Migration
def change
change_column :conferences, :revision, :integer, default: 0, null: false
end
end

View file

@ -90,7 +90,7 @@ ActiveRecord::Schema.define(version: 20170629232817) do
t.datetime "created_at"
t.datetime "updated_at"
t.string "logo_file_name"
t.integer "revision"
t.integer "revision", default: 0, null: false
t.boolean "use_vpositions", default: false
t.boolean "use_vdays", default: false
t.boolean "use_volunteers"

View file

@ -1660,4 +1660,31 @@ describe Conference do
expect{ conference.save }.to change{ EventSchedule.count }.from(2).to(1)
end
end
describe '#revision' do
let(:track) { create(:track, program: subject.program) }
let(:event) { create(:event, program: subject.program, track: track) }
let(:venue) { create(:venue, conference: subject) }
let(:room) { create(:room, venue: venue) }
it 'for change in conference' do
subject.title = 'changed'
expect{ subject.save }.to change { subject.revision }.by(1)
end
it 'for change in event' do
event.title = 'changed'
expect{ event.save }.to change { subject.revision }.by(1)
end
it 'for change in track' do
track.name = 'changed'
expect{ track.save }.to change { subject.revision }.by(1)
end
it 'for change in room' do
room.name = 'changed'
expect{ room.save }.to change { subject.revision }.by(1)
end
end
end