fix revision count and drop observers
This commit is contained in:
parent
518ecc3d4e
commit
b33e9ed28e
12 changed files with 69 additions and 34 deletions
3
Gemfile
3
Gemfile
|
|
@ -22,9 +22,6 @@ gem 'responders', '~> 2.0'
|
||||||
gem 'mysql2'
|
gem 'mysql2'
|
||||||
# gem 'pg'
|
# gem 'pg'
|
||||||
|
|
||||||
# for observing records
|
|
||||||
gem 'rails-observers'
|
|
||||||
|
|
||||||
# for tracking data changes
|
# for tracking data changes
|
||||||
gem 'paper_trail'
|
gem 'paper_trail'
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -399,8 +399,6 @@ GEM
|
||||||
rails-i18n (4.0.8)
|
rails-i18n (4.0.8)
|
||||||
i18n (~> 0.7)
|
i18n (~> 0.7)
|
||||||
railties (~> 4.0)
|
railties (~> 4.0)
|
||||||
rails-observers (0.1.2)
|
|
||||||
activemodel (~> 4.0)
|
|
||||||
rails_12factor (0.0.3)
|
rails_12factor (0.0.3)
|
||||||
rails_serve_static_assets
|
rails_serve_static_assets
|
||||||
rails_stdout_logging
|
rails_stdout_logging
|
||||||
|
|
@ -632,7 +630,6 @@ DEPENDENCIES
|
||||||
rails-assets-trianglify!
|
rails-assets-trianglify!
|
||||||
rails-assets-waypoints!
|
rails-assets-waypoints!
|
||||||
rails-i18n (~> 4.0.0)
|
rails-i18n (~> 4.0.0)
|
||||||
rails-observers
|
|
||||||
rails_12factor
|
rails_12factor
|
||||||
rdoc-generator-fivefish
|
rdoc-generator-fivefish
|
||||||
redcarpet
|
redcarpet
|
||||||
|
|
|
||||||
11
app/models/concerns/revision_count.rb
Normal file
11
app/models/concerns/revision_count.rb
Normal 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
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
class Conference < ActiveRecord::Base
|
class Conference < ActiveRecord::Base
|
||||||
|
include RevisionCount
|
||||||
require 'uri'
|
require 'uri'
|
||||||
serialize :events_per_week, Hash
|
serialize :events_per_week, Hash
|
||||||
# Needed to call 'Conference.with_role' in /models/ability.rb
|
# 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
|
(start_hour..(end_hour - 1)).cover?(current_hour) ? current_hour - start_hour : 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Return the current conference object to be used in RevisionCount
|
||||||
|
#
|
||||||
|
# ====Returns
|
||||||
|
# * +ActiveRecord+
|
||||||
|
def conference
|
||||||
|
self
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# Returns a different html colour for every i and consecutive colors are
|
# Returns a different html colour for every i and consecutive colors are
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
class Event < ActiveRecord::Base
|
class Event < ActiveRecord::Base
|
||||||
include ActiveRecord::Transitions
|
include ActiveRecord::Transitions
|
||||||
|
include RevisionCount
|
||||||
has_paper_trail on: [:create, :update], ignore: [:updated_at, :guid, :week], meta: { conference_id: :conference_id }
|
has_paper_trail on: [:create, :update], ignore: [:updated_at, :guid, :week], meta: { conference_id: :conference_id }
|
||||||
|
|
||||||
acts_as_commentable
|
acts_as_commentable
|
||||||
|
|
@ -251,6 +252,10 @@ class Event < ActiveRecord::Base
|
||||||
event_schedules.find_by(schedule_id: program.selected_schedule_id).try(:start_time)
|
event_schedules.find_by(schedule_id: program.selected_schedule_id).try(:start_time)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def conference
|
||||||
|
program.conference
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
class Room < ActiveRecord::Base
|
class Room < ActiveRecord::Base
|
||||||
|
include RevisionCount
|
||||||
belongs_to :venue
|
belongs_to :venue
|
||||||
has_many :event_schedules, dependent: :destroy
|
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
|
validates :size, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
|
||||||
|
|
||||||
|
def conference
|
||||||
|
venue.conference
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def generate_guid
|
def generate_guid
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
class Track < ActiveRecord::Base
|
class Track < ActiveRecord::Base
|
||||||
|
include RevisionCount
|
||||||
belongs_to :program
|
belongs_to :program
|
||||||
has_many :events, dependent: :nullify
|
has_many :events, dependent: :nullify
|
||||||
|
|
||||||
|
|
@ -16,6 +17,10 @@ class Track < ActiveRecord::Base
|
||||||
|
|
||||||
before_validation :capitalize_color
|
before_validation :capitalize_color
|
||||||
|
|
||||||
|
def conference
|
||||||
|
program.conference
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def generate_guid
|
def generate_guid
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,6 @@ module Osem
|
||||||
|
|
||||||
# Activate observers that should always be running.
|
# Activate observers that should always be running.
|
||||||
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
|
# 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.
|
# 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.
|
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddDefaultToRevisionInConference < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
change_column :conferences, :revision, :integer, default: 0, null: false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -90,7 +90,7 @@ ActiveRecord::Schema.define(version: 20170629232817) do
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.string "logo_file_name"
|
t.string "logo_file_name"
|
||||||
t.integer "revision"
|
t.integer "revision", default: 0, null: false
|
||||||
t.boolean "use_vpositions", default: false
|
t.boolean "use_vpositions", default: false
|
||||||
t.boolean "use_vdays", default: false
|
t.boolean "use_vdays", default: false
|
||||||
t.boolean "use_volunteers"
|
t.boolean "use_volunteers"
|
||||||
|
|
|
||||||
|
|
@ -1660,4 +1660,31 @@ describe Conference do
|
||||||
expect{ conference.save }.to change{ EventSchedule.count }.from(2).to(1)
|
expect{ conference.save }.to change{ EventSchedule.count }.from(2).to(1)
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue