diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 5e017d8c..88b89806 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -392,13 +392,22 @@ module ApplicationHelper end end - # Recieves a PaperTrail::Version object + # Recieves a model_name and id + # Returns nil if model_name is invalid # Returns object in its current state if its alive - # Returns object as it was before version's change(unless its a create event's version) - # Else Returns object as it was after version's change - def get_version_object(version) - return nil unless version - version.item || version.reify || version.next.reify + # Otherwise Returns object state just before deletion + def current_or_last_object_state(model_name, id) + 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 event_change_description(version) @@ -423,18 +432,17 @@ module ApplicationHelper end def subscription_change_description(version) - user = get_version_object(version).user + user = current_or_last_object_state(version.item_type, version.item_id).user user_name = user.name unless user.id.to_s == version.whodunnit version.event == 'create' ? "subscribed #{user_name} to" : "unsubscribed #{user_name} from" end def registration_change_description(version) if version.item_type == 'Registration' - user = get_version_object(version).user - else - registration_id = get_version_object(version).registration_id - registration_last_version = PaperTrail::Version.where(item_type: 'Registration', item_id: registration_id).last - user = get_version_object(registration_last_version).user + user = current_or_last_object_state(version.item_type, version.item_id).user + elsif version.item_type == 'EventsRegistration' + registration_id = current_or_last_object_state(version.item_type, version.item_id).registration_id + user = current_or_last_object_state('Registration', registration_id).user end if user.id.to_s == version.whodunnit @@ -453,7 +461,7 @@ module ApplicationHelper end def comment_change_description(version) - user = get_version_object(version).user + user = current_or_last_object_state(version.item_type, version.item_id).user if version.event == 'create' version.previous.nil? ? 'commented on' : "re-added #{user.name}'s comment on" else @@ -462,7 +470,7 @@ module ApplicationHelper end def vote_change_description(version) - user = get_version_object(version).user + user = current_or_last_object_state(version.item_type, version.item_id).user if version.event == 'create' version.previous.nil? ? 'voted on' : "re-added #{user.name}'s vote on" elsif version.event == 'update' @@ -506,9 +514,7 @@ module ApplicationHelper end end - def object_last_description(model_name, id) - object_version = PaperTrail::Version.where(item_type: model_name, item_id: id).last - object = (object_version.reify || object_version.item) if object_version - object.try(:name) || object.try(:title) + def link_if_alive(version, link_text, link_url) + version.item ? link_to(link_text, link_url) : link_text end end diff --git a/app/views/admin/versions/_object_desc_and_link.html.haml b/app/views/admin/versions/_object_desc_and_link.html.haml index 46521439..ae67bbd7 100644 --- a/app/views/admin/versions/_object_desc_and_link.html.haml +++ b/app/views/admin/versions/_object_desc_and_link.html.haml @@ -1,172 +1,161 @@ -- if version.item_type == 'UsersRole' - - users_role = get_version_object(version) +- case version.item_type +- when 'UsersRole' + - users_role = current_or_last_object_state(version.item_type, version.item_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) = version.event == 'create' ? 'to' : 'from' = 'user' = link_to users_role.user.name, admin_user_path(id: users_role.user.id) -- elsif version.item_type == 'Subscription' || version.item_type == 'Registration' +- 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) -- elsif version.item_type == 'Commercial' - - commercial_last_version = get_version_object(PaperTrail::Version.where(item_type: version.item_type, item_id: version.item_id).last) - - commercialable_last_version = get_version_object(PaperTrail::Version.where(item_type: commercial_last_version.commercialable_type, - item_id: commercial_last_version.commercialable_id).last) +- 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) - - case commercial_last_version.commercialable_type + - case commercial.commercialable_type - when 'Event' commercial in event - = link_to "#{commercialable_last_version.title}", - admin_conference_program_event_path(conference_id: Conference.find(version.conference_id).short_title, id: commercialable_last_version.id) + = link_to commercialable.title, + admin_conference_program_event_path(conference_id: Conference.find(version.conference_id).short_title, id: commercialable.id) - when 'Venue' commercial in venue - - if Venue.find_by(id: commercialable_last_version.id) - = link_to "#{commercialable_last_version.name}", - edit_admin_conference_venue_path(conference_id: Conference.find(version.conference_id).short_title, - id: commercialable_last_version.id, anchor: 'commercials-content') - - else - = commercialable_last_version.name + = link_to commercialable.name, + edit_admin_conference_venue_path(conference_id: Conference.find(version.conference_id).short_title, + id: commercialable.id, anchor: 'commercials-content') - when 'Conference' = link_to 'commercial', admin_conference_commercials_path(conference_id: Conference.find(version.conference_id).short_title) -- elsif %w(EventsRegistration Comment Vote).include?(version.item_type) +- when 'EventsRegistration', 'Comment', 'Vote', 'Event' = 'event' - - event_id = get_version_object(version).try(:event_id) || get_version_object(version).try(:commentable_id) - = link_to Event.find(event_id).title, + - object = current_or_last_object_state(version.item_type, version.item_id) + - event_id = object.try(:id) || object.try(:event_id) || object.try(:commentable_id) + = link_to current_or_last_object_state('Event', event_id).title, admin_conference_program_event_path(conference_id: Conference.find(version.conference_id).short_title, id: event_id) -- elsif version.item_type =='Target' +- when 'Target' = 'target' - - if version.item - = link_to Target.find(version.item_id).to_s, - admin_conference_targets_path(conference_id: Conference.find(version.conference_id).short_title) - - else - = PaperTrail::Version.where(item_type: 'Target', item_id: version.item_id).last.reify.to_s + - 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) -- elsif version.item_type == 'EventSchedule' - - event_schedule = get_version_object(version) +- when 'EventSchedule' + - event_schedule = current_or_last_object_state(version.item_type, version.item_id) event - = link_to Event.find(event_schedule.event_id), + = link_to current_or_last_object_state('Event', event_schedule.event_id).title, admin_conference_program_event_path(conference_id: Conference.find(version.conference_id).short_title, id: event_schedule.event_id) in = link_to "Schedule #{event_schedule.schedule_id}", - admin_conference_schedules_path(conference_id: Conference.find(version.conference_id).short_title, id: event_schedule.schedule_id) + admin_conference_schedule_path(conference_id: Conference.find(version.conference_id).short_title, id: event_schedule.schedule_id) -- elsif version.item_type == 'Schedule' - - schedule = get_version_object(version) - - if version.item - = link_to "Schedule #{event_schedule.schedule_id}", - admin_conference_schedules_path(conference_id: Conference.find(version.conference_id).short_title, id: event_schedule.schedule_id) - - else - = "Schedule #{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) -- elsif version.item - - case version.item_type - - when 'Conference' - = 'conference' - = link_to Conference.find(version.conference_id).title, - edit_admin_conference_path(id: Conference.find(version.conference_id).short_title) +- when 'Conference' + = 'conference' + = link_to Conference.find(version.conference_id).title, + edit_admin_conference_path(id: Conference.find(version.conference_id).short_title) - - when 'RegistrationPeriod' - = link_to 'registration period', - admin_conference_registration_period_path(conference_id: Conference.find(version.conference_id).short_title) +- when 'RegistrationPeriod' + = link_if_alive version, 'registration period', + admin_conference_registration_period_path(conference_id: Conference.find(version.conference_id).short_title) - - when 'Contact' - = link_to 'contact details', - edit_admin_conference_contact_path(conference_id: Conference.find(version.conference_id).short_title) +- when 'Contact' + = link_if_alive version, 'contact details', + edit_admin_conference_contact_path(conference_id: Conference.find(version.conference_id).short_title) - - when 'Program' - = link_to 'program', - admin_conference_program_path(conference_id: Conference.find(version.conference_id).short_title) +- when 'Program' + = link_if_alive version, 'program', + admin_conference_program_path(conference_id: Conference.find(version.conference_id).short_title) - - when 'Cfp' - = link_to 'cfp', - admin_conference_program_cfp_path(conference_id: Conference.find(version.conference_id).short_title) +- when 'Cfp' + = link_if_alive version, 'cfp', + admin_conference_program_cfp_path(conference_id: Conference.find(version.conference_id).short_title) - - when 'Track' - = 'track' - = link_to Track.find(version.item_id).name, - admin_conference_program_track_path(conference_id: Conference.find(version.conference_id).short_title, id: version.item_id) +- 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: version.item_id) - - when 'Event' - = 'event' - = link_to Event.find(version.item_id).title, - admin_conference_program_event_path(conference_id: Conference.find(version.conference_id).short_title, id: version.item_id) +- 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) - - when 'EventType' - = 'event type' - = link_to EventType.find(version.item_id).title, - admin_conference_program_event_types_path(conference_id: Conference.find(version.conference_id).short_title) +- 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) - - when 'Role' - = 'role' - = link_to Role.find(version.item_id).name, - admin_conference_role_path(conference_id: Conference.find(version.conference_id).short_title, id: version.item.name) +- 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) - - when 'Venue' - = 'venue' - = link_to Venue.find(version.item_id).name, - admin_conference_venue_path(conference_id: Conference.find(version.conference_id).short_title) +- 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) - - when 'Lodging' - = 'lodging' - = link_to Lodging.find(version.item_id).name, - admin_conference_lodgings_path(conference_id: Conference.find(version.conference_id).short_title) +- 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) - - when 'Room' - = 'room' - = link_to Room.find(version.item_id).name, - admin_conference_venue_rooms_path(conference_id: Conference.find(version.conference_id).short_title) +- 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) - - when 'Sponsor' - = 'sponsor' - = link_to Sponsor.find(version.item_id).name, - admin_conference_sponsors_path(conference_id: Conference.find(version.conference_id).short_title) +- 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) - - when 'SponsorshipLevel' - = 'sponsorship level' - = link_to SponsorshipLevel.find(version.item_id).title, - admin_conference_sponsorship_levels_path(conference_id: Conference.find(version.conference_id).short_title) +- 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) - - when 'Ticket' - = 'ticket' - = link_to Ticket.find(version.item_id).title, - admin_conference_ticket_path(conference_id: Conference.find(version.conference_id).short_title, id: version.item_id) +- 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) - - when 'Campaign' - = 'campaign' - = link_to Campaign.find(version.item_id).name, - admin_conference_campaigns_path(conference_id: Conference.find(version.conference_id).short_title) +- 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) - - when 'DifficultyLevel' - = 'difficulty level' - = link_to DifficultyLevel.find(version.item_id).title, - admin_conference_program_difficulty_level_path(conference_id: Conference.find(version.conference_id).short_title, id: version.item_id) +- when 'Splashpage' + = link_if_alive version, 'splashpage', + admin_conference_splashpage_path(conference_id: Conference.find(version.conference_id).short_title) - - when 'Splashpage' - = link_to 'splashpage', - admin_conference_splashpage_path(conference_id: Conference.find(version.conference_id).short_title) +- when 'EmailSettings' + = link_if_alive version, 'email settings', + admin_conference_emails_path(conference_id: Conference.find(version.conference_id).short_title) - - when 'EmailSettings' - = link_to 'email settings', - admin_conference_emails_path(conference_id: Conference.find(version.conference_id).short_title) - - - when 'User' - - if version.event == 'update' - = 'user' - = link_to User.find(version.item_id).name, admin_user_path(id: version.item_id) - -- else - = version.item_type.underscore.tr('_', ' ') - / The last deleted version's name/title is used to describe all the changes in object - - last_deleted_version = PaperTrail::Version.where(item_type: version.item_type, item_id: version.item_id).last.reify - = last_deleted_version.try(:title) || last_deleted_version.try(:name) +- when 'User' + - if version.event == 'update' + = 'user' + = link_to current_or_last_object_state('User', version.item_id).name, admin_user_path(id: version.item_id) - unless %w(Conference Subscription Registration User).include?(version.item_type) = "in conference" diff --git a/app/views/shared/_object_changes.html.haml b/app/views/shared/_object_changes.html.haml index 3a49b631..d01f35b6 100644 --- a/app/views/shared/_object_changes.html.haml +++ b/app/views/shared/_object_changes.html.haml @@ -21,10 +21,12 @@ - model_name = attribute.chomp('_id').camelize - if version.event != 'create' %td - = object_last_description(model_name, values[0]) + - associated_object = current_or_last_object_state(model_name, values[0]) + = associated_object.try(:title) || associated_object.try(:name) = "(ID: #{values[0].blank? ? '-' : values[0]})" %td - = object_last_description(model_name, values[1]) + - associated_object = current_or_last_object_state(model_name, values[1]) + = associated_object.try(:title) || associated_object.try(:name) = "(ID: #{values[1].blank? ? '-' : values[1]})" - else @@ -42,7 +44,8 @@ - if attribute.include?('_id') - model_name = attribute.chomp('_id').camelize %td - = object_last_description(model_name, value) + - associated_object = current_or_last_object_state(model_name, value) + = associated_object.try(:title) || associated_object.try(:name) = "(ID: #{value.blank? ? '-' : value})" - else %td= value.blank? ? '-' : value