From be4ce5cbb08943e55a0cdd638aa2bf45ecaa766f Mon Sep 17 00:00:00 2001 From: Lenny Dadu Date: Sat, 11 Dec 2021 23:57:09 +0000 Subject: [PATCH 1/2] Add delete_at in discourse_calendar_post_event_dates and show all events in past + add show_past_event in settings --- app/models/discourse_post_event/event.rb | 4 +++- app/models/discourse_post_event/event_date.rb | 6 +++--- config/settings.yml | 3 +++ ...094100_add_date_delete_to_post_event_dates.rb | 12 ++++++++++++ ...11224500_update_date_delete_from_finish_at.rb | 16 ++++++++++++++++ lib/discourse_post_event/event_finder.rb | 6 +++++- 6 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20211211094100_add_date_delete_to_post_event_dates.rb create mode 100644 db/migrate/20211211224500_update_date_delete_from_finish_at.rb diff --git a/app/models/discourse_post_event/event.rb b/app/models/discourse_post_event/event.rb index ff958cfe6..fc69a10c4 100644 --- a/app/models/discourse_post_event/event.rb +++ b/app/models/discourse_post_event/event.rb @@ -32,9 +32,11 @@ def create_or_update_event_date starts_at_changed = saved_change_to_original_starts_at ends_at_changed = saved_change_to_original_ends_at + # No one of date changed => Must keep the event return if !starts_at_changed && !ends_at_changed - event_dates.update_all(finished_at: Time.current) + # One of date changed => Must delete the event_date and create new event_date on this event + event_dates.update_all(delete_at: Time.current) set_next_date end diff --git a/app/models/discourse_post_event/event_date.rb b/app/models/discourse_post_event/event_date.rb index 322885c3a..7df4de3d7 100644 --- a/app/models/discourse_post_event/event_date.rb +++ b/app/models/discourse_post_event/event_date.rb @@ -5,9 +5,9 @@ class EventDate < ActiveRecord::Base self.table_name = 'discourse_calendar_post_event_dates' belongs_to :event - scope :pending, -> { where(finished_at: nil) } - scope :expired, -> { where('ends_at IS NOT NULL AND ends_at < ?', Time.now) } - scope :not_expired, -> { where('ends_at IS NULL OR ends_at > ?', Time.now) } + scope :pending, -> { where('delete_at IS NULL AND finished_at IS NULL') } + scope :expired, -> { where('delete_at IS NULL AND ends_at IS NOT NULL AND ends_at < ?', Time.now) } + scope :not_expired, -> { where('delete_at IS NULL AND (ends_at IS NULL OR ends_at > ?)', Time.now) } after_commit :upsert_topic_custom_field, on: %i[create] def upsert_topic_custom_field diff --git a/config/settings.yml b/config/settings.yml index 9ccecc51b..f8f52c88c 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -2,6 +2,9 @@ discourse_calendar: calendar_enabled: default: false client: true + show_past_events: + default: false + client: true holiday_calendar_topic_id: default: "" client: true diff --git a/db/migrate/20211211094100_add_date_delete_to_post_event_dates.rb b/db/migrate/20211211094100_add_date_delete_to_post_event_dates.rb new file mode 100644 index 000000000..7e0ed57fb --- /dev/null +++ b/db/migrate/20211211094100_add_date_delete_to_post_event_dates.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class AddDateDeleteToPostEventDates < ActiveRecord::Migration[6.0] + def up + add_column :discourse_calendar_post_event_dates, :delete_at, :datetime + add_index :discourse_calendar_post_event_dates, :delete_at + end + + def down + remove_column :discourse_calendar_post_event_dates, :delete_at + end +end diff --git a/db/migrate/20211211224500_update_date_delete_from_finish_at.rb b/db/migrate/20211211224500_update_date_delete_from_finish_at.rb new file mode 100644 index 000000000..5d54ed4cb --- /dev/null +++ b/db/migrate/20211211224500_update_date_delete_from_finish_at.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class UpdateDateDeleteFromFinishAt < ActiveRecord::Migration[6.0] + def up + execute "update discourse_calendar_post_event_dates SET delete_at = now() WHERE finished_at is not NULL; +UPDATE discourse_calendar_post_event_dates SET delete_at = NULL +FROM ( + SELECT DISTINCT ON (event_id) + id + FROM discourse_calendar_post_event_dates + where finished_at is not null + ORDER BY event_id, updated_at DESC +) AS sq +WHERE discourse_calendar_post_event_dates.id=sq.id;" + end +end diff --git a/lib/discourse_post_event/event_finder.rb b/lib/discourse_post_event/event_finder.rb index eb43b7fd3..f88b8d683 100644 --- a/lib/discourse_post_event/event_finder.rb +++ b/lib/discourse_post_event/event_finder.rb @@ -21,7 +21,11 @@ def self.search(user, params = {}) .where("dcped.finished_at IS NOT NULL AND (dcped.ends_at IS NOT NULL AND dcped.ends_at < ?)", Time.now) .where("discourse_post_event_events.id NOT IN (SELECT DISTINCT event_id FROM discourse_calendar_post_event_dates WHERE event_id = discourse_post_event_events.id AND finished_at IS NULL)") else - events = events.where("dcped.finished_at IS NULL AND (dcped.ends_at IS NULL OR dcped.ends_at > ?)", Time.now) + if SiteSetting.show_past_events + events = events.where("dcped.delete_at IS NULL") + else + events = events.where("dcped.delete_at IS NULL AND ((dcped.ends_at IS NOT NULL AND dcped.ends_at > ?) OR (dcped.ends_at IS NULL AND dcped.starts_at > ?))", Time.now, Time.now) + end end if params[:post_id] From f92146cf6f451b4993f3a674cd5af8d699184db9 Mon Sep 17 00:00:00 2001 From: Lenny Dadu Date: Mon, 20 Dec 2021 22:23:45 +0000 Subject: [PATCH 2/2] Add after and before params + fix delete_at -> deleted_at --- .../discourse_post_event/events_controller.rb | 3 ++- app/models/discourse_post_event/event.rb | 2 +- app/models/discourse_post_event/event_date.rb | 7 ++--- ...100_add_date_delete_to_post_event_dates.rb | 6 ++--- ...24500_update_date_delete_from_finish_at.rb | 4 +-- lib/discourse_post_event/event_finder.rb | 26 +++++++++++++++---- 6 files changed, 33 insertions(+), 15 deletions(-) diff --git a/app/controllers/discourse_post_event/events_controller.rb b/app/controllers/discourse_post_event/events_controller.rb index d86dac596..f52a77860 100644 --- a/app/controllers/discourse_post_event/events_controller.rb +++ b/app/controllers/discourse_post_event/events_controller.rb @@ -115,7 +115,8 @@ def ics_request? end def filtered_events_params - params.permit(:post_id) + # Http params permited + params.permit(:post_id, :after, :before, :deleted) end end end diff --git a/app/models/discourse_post_event/event.rb b/app/models/discourse_post_event/event.rb index fc69a10c4..5c1587123 100644 --- a/app/models/discourse_post_event/event.rb +++ b/app/models/discourse_post_event/event.rb @@ -36,7 +36,7 @@ def create_or_update_event_date return if !starts_at_changed && !ends_at_changed # One of date changed => Must delete the event_date and create new event_date on this event - event_dates.update_all(delete_at: Time.current) + event_dates.update_all(deleted_at: Time.current) set_next_date end diff --git a/app/models/discourse_post_event/event_date.rb b/app/models/discourse_post_event/event_date.rb index 7df4de3d7..568b34a35 100644 --- a/app/models/discourse_post_event/event_date.rb +++ b/app/models/discourse_post_event/event_date.rb @@ -5,9 +5,9 @@ class EventDate < ActiveRecord::Base self.table_name = 'discourse_calendar_post_event_dates' belongs_to :event - scope :pending, -> { where('delete_at IS NULL AND finished_at IS NULL') } - scope :expired, -> { where('delete_at IS NULL AND ends_at IS NOT NULL AND ends_at < ?', Time.now) } - scope :not_expired, -> { where('delete_at IS NULL AND (ends_at IS NULL OR ends_at > ?)', Time.now) } + scope :pending, -> { where('deleted_at IS NULL AND finished_at IS NULL') } + scope :expired, -> { where('deleted_at IS NULL AND ends_at IS NOT NULL AND ends_at < ?', Time.now) } + scope :not_expired, -> { where('deleted_at IS NULL AND (ends_at IS NULL OR ends_at > ?)', Time.now) } after_commit :upsert_topic_custom_field, on: %i[create] def upsert_topic_custom_field @@ -60,6 +60,7 @@ def ended? # event_id :integer # starts_at :datetime # ends_at :datetime +# deleted_at :datetime # reminder_counter :integer default(0) # event_will_start_sent_at :datetime # event_started_sent_at :datetime diff --git a/db/migrate/20211211094100_add_date_delete_to_post_event_dates.rb b/db/migrate/20211211094100_add_date_delete_to_post_event_dates.rb index 7e0ed57fb..c2ab1d2bc 100644 --- a/db/migrate/20211211094100_add_date_delete_to_post_event_dates.rb +++ b/db/migrate/20211211094100_add_date_delete_to_post_event_dates.rb @@ -2,11 +2,11 @@ class AddDateDeleteToPostEventDates < ActiveRecord::Migration[6.0] def up - add_column :discourse_calendar_post_event_dates, :delete_at, :datetime - add_index :discourse_calendar_post_event_dates, :delete_at + add_column :discourse_calendar_post_event_dates, :deleted_at, :datetime + add_index :discourse_calendar_post_event_dates, :deleted_at end def down - remove_column :discourse_calendar_post_event_dates, :delete_at + remove_column :discourse_calendar_post_event_dates, :deleted_at end end diff --git a/db/migrate/20211211224500_update_date_delete_from_finish_at.rb b/db/migrate/20211211224500_update_date_delete_from_finish_at.rb index 5d54ed4cb..d6f1a3d1e 100644 --- a/db/migrate/20211211224500_update_date_delete_from_finish_at.rb +++ b/db/migrate/20211211224500_update_date_delete_from_finish_at.rb @@ -2,8 +2,8 @@ class UpdateDateDeleteFromFinishAt < ActiveRecord::Migration[6.0] def up - execute "update discourse_calendar_post_event_dates SET delete_at = now() WHERE finished_at is not NULL; -UPDATE discourse_calendar_post_event_dates SET delete_at = NULL + execute "update discourse_calendar_post_event_dates SET deleted_at = now() WHERE finished_at is not NULL; +UPDATE discourse_calendar_post_event_dates SET deleted_at = NULL FROM ( SELECT DISTINCT ON (event_id) id diff --git a/lib/discourse_post_event/event_finder.rb b/lib/discourse_post_event/event_finder.rb index f88b8d683..23d07185c 100644 --- a/lib/discourse_post_event/event_finder.rb +++ b/lib/discourse_post_event/event_finder.rb @@ -7,6 +7,7 @@ def self.search(user, params = {}) topics = listable_topics(guardian) pms = private_messages(user) + # Commun data SQL query events = DiscoursePostEvent::Event .select("discourse_post_event_events.*, dcped.starts_at") .joins(post: :topic) @@ -15,24 +16,39 @@ def self.search(user, params = {}) .joins("LEFT JOIN discourse_calendar_post_event_dates dcped ON dcped.event_id = discourse_post_event_events.id") .order("dcped.starts_at ASC") + # Filter events after this date + if params[:after] + events = events.where("dcped.starts_at >= ? OR dcped.ends_at >= ? ", params[:after], params[:after]) + end + + # Filter events before this date + if params[:before] + events = events.where("dcped.ends_at <= ? OR (dcped.ends_at IS NULL AND dcped.starts_at <= ?)", params[:before], params[:before]) + end + + # All events deleted + events = events.where("dcped.deleted_at IS NULL") + if params[:expired] - # The second part below makes the query ignore events that have non-expired event-dates + # Filter the expired events events = events .where("dcped.finished_at IS NOT NULL AND (dcped.ends_at IS NOT NULL AND dcped.ends_at < ?)", Time.now) .where("discourse_post_event_events.id NOT IN (SELECT DISTINCT event_id FROM discourse_calendar_post_event_dates WHERE event_id = discourse_post_event_events.id AND finished_at IS NULL)") else - if SiteSetting.show_past_events - events = events.where("dcped.delete_at IS NULL") - else - events = events.where("dcped.delete_at IS NULL AND ((dcped.ends_at IS NOT NULL AND dcped.ends_at > ?) OR (dcped.ends_at IS NULL AND dcped.starts_at > ?))", Time.now, Time.now) + # Only future events + if not SiteSetting.show_past_events + events = events.where("(dcped.ends_at IS NOT NULL AND dcped.ends_at > ?) OR (dcped.ends_at IS NULL AND dcped.starts_at > ?)", Time.now, Time.now) end end + # if params[:post_id] events = events.where(id: Array(params[:post_id])) end + # Filter events from sategory if params[:category_id].present? + # And sub categories if params[:include_subcategories].present? events = events.where(topics: { category_id: Category.subcategory_ids(params[:category_id].to_i) }) else