diff --git a/app/controllers/conference_controller.rb b/app/controllers/conference_controller.rb index 04e128b0..afd35ce6 100644 --- a/app/controllers/conference_controller.rb +++ b/app/controllers/conference_controller.rb @@ -4,6 +4,42 @@ class ConferenceController < ApplicationController redirect_to root_path, notice: "Conference not ready yet!!" unless @conference.make_conference_public? end + def subscribe + conference = Conference.find_by_short_title(params[:id]) + if current_user.subscriptions.where(conference: conference).blank? + subscription = Subscription.new(user_id: current_user.id, conference_id: conference.id) + begin + subscription.save! + flash[:success] = "You have been subscribed to receive Email Notifications from this Conference." + redirect_to root_path + rescue ActiveRecord::RecordInvalid + flash[:error] = subscription.errors.full_messages.to_sentence + redirect_to root_path + end + else + flash[:notice] = "Already Subscribed" + redirect_to root_path + end + end + + def unsubscribe + conference = Conference.find_by_short_title(params[:id]) + subscription = current_user.subscriptions.where(conference_id: conference.id).first + if subscription.blank? + flash[:notice] = "Already Unsubscribed" + redirect_to root_path + else + begin + subscription.destroy! + flash[:notice] = "You have been unsubscribed and now you won't be receiving any Email Notifications." + redirect_to root_path + rescue ActiveRecord::RecordInvalid + flash[:error] = subscription.errors.full_messages.to_sentence + redirect_to root_path + end + end + end + def gallery_photos @photos = Conference.find_by_short_title(params[:id]).photos render "photos", formats: [:js] diff --git a/app/controllers/conference_registration_controller.rb b/app/controllers/conference_registration_controller.rb index 6a8acd87..ee4bc677 100644 --- a/app/controllers/conference_registration_controller.rb +++ b/app/controllers/conference_registration_controller.rb @@ -65,6 +65,10 @@ class ConferenceRegistrationController < ApplicationController registration.conference_id = conference.id registration.save! + if user.subscriptions.where(conference: conference).blank? + subscription = Subscription.new(conference_id: conference.id, user_id: user.id) + redirect_message = subscription.save ? 'You are now Registered and will be receiving Email Notifications.' : 'You are now Registered.' + end else registration.update_attributes!(registration_params) end @@ -75,7 +79,6 @@ class ConferenceRegistrationController < ApplicationController return end - redirect_message = 'You are now registered.' if update_registration redirect_message = 'Registration updated.' else @@ -93,6 +96,10 @@ class ConferenceRegistrationController < ApplicationController conference = Conference.find_by(short_title: params[:id]) user = current_user registration = user.registrations.where(conference_id: conference.id).first + subscription = user.subscriptions.where(conference: conference) + unless subscription.blank? + subscription.first.destroy + end registration.destroy redirect_to :root end diff --git a/app/mailers/mailbot.rb b/app/mailers/mailbot.rb index 74bb4224..f76ef01a 100644 --- a/app/mailers/mailbot.rb +++ b/app/mailers/mailbot.rb @@ -14,7 +14,7 @@ class Mailbot < ActionMailer::Base build_email(conference, person.email, conference.email_settings.accepted_subject, - conference.email_settings.generate_accepted_email(event)) + conference.email_settings.generate_event_email(event, accepted_email_template)) end def rejection_mail(event) @@ -23,59 +23,58 @@ class Mailbot < ActionMailer::Base build_email(conference, person.email, conference.email_settings.rejected_subject, - conference.email_settings.generate_rejected_email(event)) + conference.email_settings.generate_event_email(event, rejected_email_template)) end def confirm_reminder_mail(event) conference = event.conference person = event.submitter - build_email(conference, person.email, conference.email_settings.confirmed_without_registration_subject, - conference.email_settings.confirmed_but_not_registered_email(event)) + conference.email_settings.generate_event_email(event, confirmed_email_template)) end def conference_date_update_mail(conference) - conference.registrations.each do |user| + User.joins(:subscriptions).merge(conference.subscriptions) do |user| build_email(conference, - user.user.email, + user.email, conference.email_settings.updated_conference_dates_subject, conference.email_settings.generate_email_on_conf_updates(conference, user, conference.email_settings.updated_conference_dates_template)) end end def conference_registration_date_update_mail(conference) - conference.registrations.each do |user| + User.joins(:subscriptions).merge(conference.subscriptions).uniq.joins('INNER JOIN registrations ON registrations.user_id != users.id').merge(conference.registrations) do |user| build_email(conference, - user.user.email, + user.email, conference.email_settings.updated_conference_registration_dates_subject, conference.email_settings.generate_email_on_conf_updates(conference, user, conference.email_settings.updated_conference_registration_dates_template)) end end def send_email_on_venue_update(conference) - conference.registrations.each do |user| + User.joins(:subscriptions).merge(conference.subscriptions) do |user| build_email(conference, - user.user.email, + user.email, conference.email_settings.venue_update_subject, conference.email_settings.generate_email_on_conf_updates(conference, user, conference.email_settings.venue_update_template)) end end def send_on_schedule_public(conference) - conference.registrations.each do |user| + User.joins(:subscriptions).merge(conference.subscriptions) do |user| build_email(conference, - user.user.email, + user.email, conference.email_settings.call_for_papers_schedule_public_subject, conference.email_settings.generate_email_on_conf_updates(conference, user, conference.email_settings.call_for_papers_schedule_public_template)) end end def send_on_call_for_papers_dates_updates(conference) - conference.registrations.each do |user| + User.joins(:subscriptions).merge(conference.subscriptions) do |user| build_email(conference, - user.user.email, + user.email, conference.email_settings.call_for_papers_dates_updates_subject, conference.email_settings.generate_email_on_conf_updates(conference, user, conference.email_settings.call_for_papers_dates_updates_template)) end diff --git a/app/models/conference.rb b/app/models/conference.rb index e30c6a31..23252d79 100644 --- a/app/models/conference.rb +++ b/app/models/conference.rb @@ -50,6 +50,7 @@ class Conference < ActiveRecord::Base has_many :campaigns, dependent: :destroy has_many :commercials, as: :commercialable, dependent: :destroy has_many :subscriptions, dependent: :destroy + belongs_to :venue accepts_nested_attributes_for :rooms, reject_if: proc { |r| r['name'].blank? }, allow_destroy: true accepts_nested_attributes_for :tracks, reject_if: proc { |r| r['name'].blank? }, allow_destroy: true diff --git a/app/models/email_settings.rb b/app/models/email_settings.rb index d7a5c2e4..6ada5ca6 100644 --- a/app/models/email_settings.rb +++ b/app/models/email_settings.rb @@ -41,28 +41,14 @@ class EmailSettings < ActiveRecord::Base h end - def generate_accepted_email(event) + def generate_event_mail(event, event_template) values = get_values(event.conference, event.submitter, event) - template = accepted_email_template - parse_template(template, values) - end - - def generate_rejected_email(event) - values = get_values(event.conference, event.submitter, event) - template = rejected_email_template - parse_template(template, values) - end - - def confirmed_but_not_registered_email(event) - values = get_values(event.conference, event.submitter, event) - template = confirmed_email_template - parse_template(template, values) + parse_template(event_template, values) end def generate_email_on_conf_updates(conference, user, conf_update_template) values = get_values(conference, user) - template = conf_update_template - parse_template(template, values) + parse_template(conf_update_template, values) end def parse_template(text, values) diff --git a/app/models/subscription.rb b/app/models/subscription.rb index 59e03f44..86d94350 100644 --- a/app/models/subscription.rb +++ b/app/models/subscription.rb @@ -1,5 +1,6 @@ class Subscription < ActiveRecord::Base attr_accessible :user_id, :conference_id + validates_uniqueness_of :user_id, scope: [:conference_id] belongs_to :conference belongs_to :user end diff --git a/app/views/home/_conference_details.html.haml b/app/views/home/_conference_details.html.haml index a401ea44..6b20c75d 100644 --- a/app/views/home/_conference_details.html.haml +++ b/app/views/home/_conference_details.html.haml @@ -20,6 +20,12 @@ = simple_format(conference.venue.description, class: 'lead') .col-md-2 .btn-group-vertical + - unless current_user.blank? + - if Conference.joins(:subscriptions).merge(current_user.subscriptions).include? conference + = link_to "Unsubscribe", subscription_conference_path(conference.short_title), method: "DELETE", class: "btn btn-danger btn-group-vertical" + -else + = link_to "Subscribe", subscription_conference_path(conference.short_title), method: "PATCH", class: "btn btn-info btn-group-vertical" + - if !@conference || @conference != conference - if conference.make_conference_public? = link_to "View Conference", conference_path(conference.short_title), :class =>"btn btn-default" diff --git a/config/routes.rb b/config/routes.rb index 042b418b..62ad2885 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -96,6 +96,8 @@ Osem::Application.routes.draw do patch "/register" => "conference_registration#update" delete "/register" => "conference_registration#unregister" get "gallery_photos" + patch "subscription" => "conference#subscribe" + delete "subscription" => "conference#unsubscribe" end end diff --git a/spec/features/proposal_spec.rb b/spec/features/proposal_spec.rb index 0dc51b73..68c5f9e0 100644 --- a/spec/features/proposal_spec.rb +++ b/spec/features/proposal_spec.rb @@ -130,7 +130,7 @@ feature Event do # Register for conference find('#register').click - expect(flash).to eq('You are now registered.') + expect(flash).to eq('You are now Registered and will be receiving Email Notifications.') # Withdraw proposal visit conference_proposal_index_path(conference.short_title)