Show conference changelog

Use load_and_authorize_resource in versions controlller
Add conference specifc route to revision history page
Users with role can view revision_history only for the versions they have access to
Handle versions where conference_id is not set (records before papertrail was introduced)
This commit is contained in:
Nishanth Vijayan 2016-08-06 17:22:53 +05:30 committed by Shlok Srivastava
parent 5985daf677
commit 68788ce9fc
13 changed files with 240 additions and 141 deletions

View file

@ -1,17 +1,17 @@
module Admin
class VersionsController < Admin::BaseController
skip_authorization_check
load_resource :conference, find_by: :short_title
load_and_authorize_resource class: PaperTrail::Version
def index
authorize! :index, PaperTrail::Version.new(item_type: 'User')
conf_ids_for_organizer = current_user.is_admin? ? Conference.pluck(:id) : Conference.with_role(:organizer, current_user).pluck(:id)
@versions = PaperTrail::Version.where(["conference_id IN (?) OR item_type = 'User'", conf_ids_for_organizer])
@conf_ids_with_role = current_user.is_admin? ? Conference.pluck(:short_title) : Conference.with_role([:organizer, :cfp, :info_desk], current_user).pluck(:short_title)
return if @conference.blank?
authorize! :index, PaperTrail::Version.new(conference_id: @conference.id)
@versions = @versions.where(conference_id: @conference.id)
end
def revert_attribute
@version = PaperTrail::Version.find(params[:id])
authorize! :revert_attribute, @version
if params[:attribute] && @version.changeset.reject{ |_, values| values[0].blank? && values[1].blank? }.keys.include?(params[:attribute])
if @version.item[params[:attribute]] == @version.changeset[params[:attribute]][0]
flash[:error] = 'The item is already in the state that you are trying to revert it back to'
@ -33,9 +33,6 @@ module Admin
end
def revert_object
@version = PaperTrail::Version.find(params[:id])
authorize! :revert_object, @version
if @version.event != 'create'
if @version.reify.save
flash[:notice] = 'The selected change was successfully reverted'

View file

@ -98,25 +98,6 @@ module ApplicationHelper
.reverse.sub(',', ' dna ').reverse
end
# Recieves a model_name and id
# Returns nil if model_name is invalid
# Returns object in its current state if its alive
# Otherwise Returns object state just before deletion
def current_or_last_object_state(model_name, id)
return nil unless id.present? && model_name.present?
begin
object = model_name.constantize.find_by(id: id)
rescue NameError
return nil
end
if object.nil?
object_last_version = PaperTrail::Version.where(item_type: model_name, item_id: id).last
object = object_last_version.reify if object_last_version
end
object
end
def normalize_array_length(hashmap, length)
hashmap.each do |_, value|
if value.length < length

View file

@ -2,8 +2,52 @@ module VersionsHelper
##
# Groups functions related to change description
##
def link_if_alive(version, link_text, link_url)
version.item ? link_to(link_text, link_url) : link_text
def link_if_alive(version, link_text, link_url, conference)
version.item && conference ? link_to(link_text, link_url) : "#{link_text} with ID #{version.item_id}"
end
def link_to_conference(conference_id)
return 'deleted conference' if conference_id.nil?
conference = Conference.find_by(id: conference_id)
if conference
link_to conference.short_title,
edit_admin_conference_path(conference.short_title)
else
short_title = current_or_last_object_state('Conference', conference_id).try(:short_title) || ''
" #{short_title} with ID #{conference_id}"
end
end
def link_to_user(user_id)
return 'Someone (probably via the console)' unless user_id
user = User.find_by(id: user_id)
if user
link_to user.name, admin_user_path(id: user_id)
else
name = current_or_last_object_state('User', user_id).try(:name)
"#{name ? name : 'Unknown user'} with ID #{user_id}"
end
end
# Recieves a model_name and id
# Returns nil if model_name is invalid
# Returns object in its current state if its alive
# Otherwise Returns object state just before deletion
def current_or_last_object_state(model_name, id)
return nil unless id.present? && model_name.present?
begin
object = model_name.constantize.find_by(id: id)
rescue NameError
return nil
end
if object.nil?
object_last_version = PaperTrail::Version.where(item_type: model_name, item_id: id).last
object = object_last_version.reify if object_last_version
end
object
end
def subscription_change_description(version)

View file

@ -167,9 +167,8 @@ class AdminAbility
role.resource_type == 'Track' && (track_ids.include? role.resource_id)
end
can [:index, :revert_object, :revert_attribute], PaperTrail::Version do |version|
version.item_type == 'User' || (conf_ids.include? version.conference_id)
end
can [:index, :revert_object, :revert_attribute], PaperTrail::Version, item_type: 'User'
can [:index, :revert_object, :revert_attribute], PaperTrail::Version, conference_id: conf_ids
end
def signed_in_with_cfp_role(user)
@ -208,9 +207,10 @@ class AdminAbility
(Conference.with_role(:cfp, user).pluck(:id).include? role.resource_id)
end
can [:index, :revert_object, :revert_attribute], PaperTrail::Version, item_type: 'Event', conference_id: conf_ids_for_cfp
can [:index, :revert_object, :revert_attribute], PaperTrail::Version, item_type: 'Vote', conference_id: conf_ids_for_cfp
can [:index, :revert_object, :revert_attribute], PaperTrail::Version do |version|
can [:index, :revert_object, :revert_attribute], PaperTrail::Version,
item_type: %w(Event EventType Track DifficultyLevel EmailSettings Room Cfp Program Comment), conference_id: conf_ids_for_cfp
can [:index, :revert_object, :revert_attribute], PaperTrail::Version,
["item_type = 'Commercial' AND conference_id IN (?) AND (object LIKE '%Event%' OR object_changes LIKE '%Event%')", conf_ids_for_cfp] do |version|
version.item_type == 'Commercial' && conf_ids_for_cfp.include?(version.conference_id) &&
(version.object.to_s.include?('Event') || version.object_changes.to_s.include?('Event'))
end
@ -244,6 +244,7 @@ class AdminAbility
role.resource_type == 'Conference' && role.name == 'info_desk' &&
(Conference.with_role(:info_desk, user).pluck(:id).include? role.resource_id)
end
can [:index, :revert_object, :revert_attribute], PaperTrail::Version, item_type: 'Registration', conference_id: conf_ids_for_info_desk
end
def signed_in_with_volunteers_coordinator_role(user)

View file

@ -1,84 +1,92 @@
- conference = Conference.find_by(id: version.conference_id)
- conference_short_title = conference.try(:short_title) || current_or_last_object_state(version.item_type, version.item_id).try(:conference).try(:short_title) || ''
- case version.item_type
- when 'UsersRole'
- users_role = current_or_last_object_state(version.item_type, version.item_id)
- user = current_or_last_object_state('User', users_role.user_id)
= 'role'
= link_to users_role.role.name, admin_conference_role_path(conference_id: Conference.find(version.conference_id).short_title, id: users_role.role.name)
= link_to users_role.role.name, admin_conference_role_path(conference.short_title, users_role.role.name)
= version.event == 'create' ? 'to' : 'from'
= 'user'
= link_to (user.try(:name) || 'deleted user'), admin_user_path(id: users_role.user.id)
= link_to_user(users_role.user_id)
- when 'Subscription', 'Registration'
= 'conference'
= link_to Conference.find(version.conference_id).title,
admin_conference_registrations_path(conference_id: Conference.find(version.conference_id).short_title)
= link_to_conference(version.conference_id)
- when 'Commercial'
- commercial = current_or_last_object_state(version.item_type, version.item_id)
- commercialable = current_or_last_object_state(commercial.commercialable_type, commercial.commercialable_id)
- commercialable_last_version = PaperTrail::Version.where(item_type: commercial.commercialable_type, item_id: commercial.commercialable_id).last
- case commercial.commercialable_type
- when 'Event'
commercial in
- if commercialable_last_version.item
event
= 'commercial in event'
- if commercialable && conference
= link_to commercialable.title,
admin_conference_program_event_path(conference_id: Conference.find(version.conference_id).short_title, id: commercialable.id)
admin_conference_program_event_path(conference_id: conference.short_title,
id: commercialable.id)
- else
= commercialable.title
= "with ID #{commercialable.id}"
- when 'Venue'
commercial in venue
- if commercialable_last_version.item
= 'commercial in venue'
- if commercialable && conference
= link_to commercialable.name,
edit_admin_conference_venue_path(conference_id: Conference.find(version.conference_id).short_title,
id: commercialable.id, anchor: 'commercials-content')
edit_admin_conference_venue_path(conference_id: conference_short_title,
id: commercialable.id, anchor: 'commercials-content')
- else
= commercialable.name
= "with ID #{commercialable.id}"
- when 'Conference'
= link_to 'commercial',
admin_conference_commercials_path(conference_id: Conference.find(version.conference_id).short_title)
= 'commercial in conference'
- if commercialable
= link_to commercialable.short_title,
admin_conference_commercials_path(conference_id: commercialable.short_title)
- else
= commercialable.short_title
= "with ID #{commercialable.id}"
- when 'EventsRegistration', 'Comment', 'Vote', 'Event'
= 'event'
- object = current_or_last_object_state(version.item_type, version.item_id)
- event_id = object.try(:event_id) || object.try(:commentable_id) || object.id
= link_to (current_or_last_object_state('Event', event_id).try(:title) || 'deleted event'),
admin_conference_program_event_path(conference_id: Conference.find(version.conference_id).short_title, id: event_id)
admin_conference_program_event_path(conference_id: conference_short_title, id: event_id)
- when 'Target'
= 'target'
- target = current_or_last_object_state(version.item_type, version.item_id)
= link_if_alive version, target.to_s, admin_conference_targets_path(conference_id: Conference.find(version.conference_id).short_title)
= link_if_alive version, target.to_s, admin_conference_targets_path(conference_id: conference_short_title), conference
- when 'EventSchedule'
- event_schedule = current_or_last_object_state(version.item_type, version.item_id)
event
= link_to (current_or_last_object_state('Event', event_schedule.event_id).try(:title) || 'deleted event'),
admin_conference_program_event_path(conference_id: Conference.find(version.conference_id).short_title, id: event_schedule.event_id)
= link_to (current_or_last_object_state('Event', event_schedule.event_id).try(:title) || 'deleted'),
admin_conference_program_event_path(conference_id: conference_short_title, id: event_schedule.event_id)
in
= link_to "Schedule #{event_schedule.schedule_id}",
admin_conference_schedule_path(conference_id: Conference.find(version.conference_id).short_title, id: event_schedule.schedule_id)
admin_conference_schedule_path(conference_id: conference_short_title, id: event_schedule.schedule_id)
- when 'Schedule'
= link_if_alive version, "Schedule #{version.item_id}",
admin_conference_schedule_path(conference_id: Conference.find(version.conference_id).short_title, id: version.item_id)
admin_conference_schedule_path(conference_id: conference_short_title, id: version.item_id),
conference
- when 'Conference'
= 'conference'
= link_to Conference.find(version.conference_id).title,
edit_admin_conference_path(id: Conference.find(version.conference_id).short_title)
= link_to_conference(version.item_id)
- when 'RegistrationPeriod'
= link_if_alive version, 'registration period',
admin_conference_registration_period_path(conference_id: Conference.find(version.conference_id).short_title)
admin_conference_registration_period_path(conference_id: conference_short_title),
conference
- when 'Contact'
= link_if_alive version, 'contact details',
edit_admin_conference_contact_path(conference_id: Conference.find(version.conference_id).short_title)
edit_admin_conference_contact_path(conference_id: conference_short_title),
conference
- when 'Booth'
= 'booth'
@ -88,94 +96,108 @@
- when 'Program'
= link_if_alive version, 'program',
admin_conference_program_path(conference_id: Conference.find(version.conference_id).short_title)
admin_conference_program_path(conference_id: conference_short_title),
conference
- when 'Cfp'
= 'cfp for'
- cfp = current_or_last_object_state(version.item_type, version.item_id)
= link_if_alive version, cfp.cfp_type,
admin_conference_program_cfp_path(conference_id: Conference.find(version.conference_id).short_title, id: version.item_id)
admin_conference_program_cfp_path(conference_id: conference_short_title, id: version.item_id),
conference
- when 'Track'
= 'track'
- track = current_or_last_object_state(version.item_type, version.item_id)
= link_if_alive version, track.name,
admin_conference_program_track_path(conference_id: Conference.find(version.conference_id).short_title, id: track.try(:short_name))
admin_conference_program_track_path(conference_id: conference_short_title, id: track.try(:short_name)),
conference
- when 'EventType'
= 'event type'
- event_type = current_or_last_object_state(version.item_type, version.item_id)
= link_if_alive version, event_type.title,
admin_conference_program_event_types_path(conference_id: Conference.find(version.conference_id).short_title)
admin_conference_program_event_types_path(conference_id: conference_short_title),
conference
- when 'Role'
= 'role'
- role = current_or_last_object_state(version.item_type, version.item_id)
= link_if_alive version, role.name,
admin_conference_role_path(conference_id: Conference.find(version.conference_id).short_title, id: role.name)
admin_conference_role_path(conference_id: conference_short_title, id: role.name),
conference
- when 'Venue'
= 'venue'
- venue = current_or_last_object_state(version.item_type, version.item_id)
= link_if_alive version, venue.name,
admin_conference_venue_path(conference_id: Conference.find(version.conference_id).short_title)
admin_conference_venue_path(conference_id: conference_short_title),
conference
- when 'Lodging'
= 'lodging'
- lodging = current_or_last_object_state(version.item_type, version.item_id)
= link_if_alive version, lodging.name,
admin_conference_lodgings_path(conference_id: Conference.find(version.conference_id).short_title)
admin_conference_lodgings_path(conference_id: conference_short_title),
conference
- when 'Room'
= 'room'
- room = current_or_last_object_state(version.item_type, version.item_id)
= link_if_alive version, room.name,
admin_conference_venue_rooms_path(conference_id: Conference.find(version.conference_id).short_title)
admin_conference_venue_rooms_path(conference_id: conference_short_title),
conference
- when 'Sponsor'
= 'sponsor'
- sponsor = current_or_last_object_state(version.item_type, version.item_id)
= link_if_alive version, sponsor.name,
admin_conference_sponsors_path(conference_id: Conference.find(version.conference_id).short_title)
admin_conference_sponsors_path(conference_id: conference_short_title),
conference
- when 'SponsorshipLevel'
= 'sponsorship level'
- sponsorship_level = current_or_last_object_state(version.item_type, version.item_id)
= link_if_alive version, sponsorship_level.title,
admin_conference_sponsorship_levels_path(conference_id: Conference.find(version.conference_id).short_title)
admin_conference_sponsorship_levels_path(conference_id: conference_short_title),
conference
- when 'Ticket'
= 'ticket'
- ticket = current_or_last_object_state(version.item_type, version.item_id)
= link_if_alive version, ticket.title,
admin_conference_ticket_path(conference_id: Conference.find(version.conference_id).short_title, id: version.item_id)
admin_conference_ticket_path(conference_id: conference_short_title, id: version.item_id),
conference
- when 'Campaign'
= 'campaign'
- campaign = current_or_last_object_state(version.item_type, version.item_id)
= link_if_alive version, campaign.name,
admin_conference_campaigns_path(conference_id: Conference.find(version.conference_id).short_title)
admin_conference_campaigns_path(conference_id: conference_short_title),
conference
- when 'DifficultyLevel'
= 'difficulty level'
- difficulty_level = current_or_last_object_state(version.item_type, version.item_id)
= link_if_alive version, difficulty_level.title,
admin_conference_program_difficulty_level_path(conference_id: Conference.find(version.conference_id).short_title, id: version.item_id)
admin_conference_program_difficulty_level_path(conference_id: conference_short_title, id: version.item_id),
conference
- when 'Splashpage'
= link_if_alive version, 'splashpage',
admin_conference_splashpage_path(conference_id: Conference.find(version.conference_id).short_title)
admin_conference_splashpage_path(conference_id: conference_short_title),
conference
- when 'EmailSettings'
= link_if_alive version, 'email settings',
admin_conference_emails_path(conference_id: Conference.find(version.conference_id).short_title)
admin_conference_emails_path(conference_id: conference_short_title),
conference
- when 'User'
- if version.event == 'update'
= 'user'
= link_to (current_or_last_object_state('User', version.item_id).try(:name) || 'deleted user'), admin_user_path(id: version.item_id)
= link_to_user(version.item_id)
- unless %w(Conference Subscription Registration User).include?(version.item_type)
= "in conference"
= link_to Conference.find(version.conference_id).short_title,
edit_admin_conference_path(id: Conference.find(version.conference_id).short_title)
= 'in conference'
= link_to_conference(version.conference_id)

View file

@ -1,6 +1,16 @@
.row
.col-md-12
.page-header
.dropdown.pull-right
%button.btn.btn-success.dropdown-toggle{ 'data-toggle' => 'dropdown', type: 'button' }
= @conference.nil? ? 'All Conferences' : @conference.short_title
%span.caret
%ul.dropdown-menu
%li= link_to 'All Conferences & Users', admin_revision_history_path
- @conf_ids_with_role.each do |conference_short_title|
%li= link_to conference_short_title, admin_conference_revision_history_path(conference_id: conference_short_title)
%h1 Revision History
%p.text-muted
Log of changes made to conferences and associated resources

View file

@ -143,8 +143,15 @@
= link_to(admin_conference_roles_path(@conference.short_title)) do
%span.fa.fa-group
Roles
- if can? :index, @conference.resources.new
%li
= link_to admin_conference_resources_path(@conference.short_title) do
%span.fa.fa-pencil-square
Resources
- if can?(:index, PaperTrail::Version.new(conference_id: @conference.id, item_type: 'Event')) || can?(:index, PaperTrail::Version.new(conference_id: @conference.id, item_type: 'Registration'))
%li{:class=> active_nav_li(admin_conference_revision_history_path(@conference.short_title))}
= link_to(admin_conference_revision_history_path(@conference.short_title)) do
%span.fa.fa-history
Revision History

View file

@ -27,7 +27,7 @@
= link_to(admin_users_path) do
%span.fa.fa-user
Users
- if can? :index, PaperTrail::Version.new(item_type: 'User')
- if can? :index, PaperTrail::Version
%li
= link_to(admin_revision_history_path) do
%span.fa.fa-history

View file

@ -53,7 +53,7 @@
= link_to(admin_users_path) do
%span.fa.fa-user
Users
- if can? :index, PaperTrail::Version.new(item_type: 'User')
- if can? :index, PaperTrail::Version
%li
= link_to(admin_revision_history_path) do
%span.fa.fa-history