Skip to content

Commit 5794b97

Browse files
committed
Add event organizers.
0082, 0083, 0084, 0085, 0086 0140 Allow organizers to edit an event. 0133, 0190, 0192, 0193, 0198, 0211
1 parent 76ddcad commit 5794b97

File tree

13 files changed

+217
-12
lines changed

13 files changed

+217
-12
lines changed

app/abilities/ability.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def initialize(user)
7171
can [:create, :destroy], CommunityMember, :user_id => user.id
7272
can [:destroy, :edit, :update], CommunityMember, :community => user_is_community_organizer
7373
can [:destroy], CommunityMember, :user_id => user.id
74-
can [:new, :create], Event, :community => user_is_community_organizer
74+
can [:create, :edit, :new, :update], Event, :community => user_is_community_organizer
7575

7676
if user.moderator?
7777
can [:hide, :hidecomment], DiaryEntry

app/controllers/events_controller.rb

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
class EventsController < ApplicationController
22
layout "site"
33
before_action :authorize_web
4-
before_action :set_event, :only => [:edit, :show]
4+
before_action :set_event, :only => [:edit, :show, :update]
55
# This needs to be one before load_and_authorize_resource, so cancancan will be handed
66
# an event that contains a community, based on the input parameter community_id.
77
before_action :set_params_for_new, :only => [:new]
@@ -36,16 +36,14 @@ def edit; end
3636
# POST /events.json
3737
def create
3838
@event = Event.new(event_params)
39+
@event_organizer = EventOrganizer.new(:event => @event, :user => current_user)
3940

40-
respond_to do |format|
41-
if @event.save
42-
warn_if_event_in_past
43-
format.html { redirect_to @event, :notice => t(".success") }
44-
format.json { render :show, :status => :created, :location => @event }
45-
else
46-
format.html { render :new }
47-
format.json { render :json => @event.errors, :status => :unprocessable_entity }
48-
end
41+
if @event.save && @event_organizer.save
42+
warn_if_event_in_past
43+
redirect_to @event, :notice => t(".success")
44+
else
45+
flash.now[:alert] = t(".failure")
46+
render :new
4947
end
5048
end
5149

@@ -58,6 +56,15 @@ def show
5856
render :template => "communities/no_such_community", :status => :not_found
5957
end
6058

59+
def update
60+
if @event.update(event_params)
61+
redirect_to @event, :notice => t(".success")
62+
else
63+
flash.now[:alert] = t(".failure")
64+
render :edit
65+
end
66+
end
67+
6168
private
6269

6370
def warn_if_event_in_past

app/models/event.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
class Event < ApplicationRecord
1919
belongs_to :community
20+
has_many :event_organizers
2021

2122
scope :future, -> { where("moment >= ?", Time.now.utc) }
2223
scope :past, -> { where("moment < ?", Time.now.utc) }
@@ -47,6 +48,10 @@ class Event < ApplicationRecord
4748
}
4849
)
4950

51+
def organizers
52+
EventOrganizer.where(:event_id => id)
53+
end
54+
5055
def past?
5156
moment < Time.now.utc
5257
end

app/models/event_organizer.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
class EventOrganizer < ApplicationRecord
2+
belongs_to :event
3+
belongs_to :user
4+
end

app/views/events/edit.html.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<h1><%= t(".edit_event") %></h1>
2+
3+
<%= render "form", :event => @event %>

app/views/events/show.html.erb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
<%= t(".hosted_by") %>: <strong><%= link_to @event.community.name, community_path(@event.community) %></strong>
3333
</p>
3434
<p>
35-
<%= t(".organized_by") %>: <strong>TBD</strong>
35+
<%= t(".organized_by") %>: <% @event.organizers.each do |organizer| %>
36+
<strong><%= link_to organizer.user.display_name, user_path(organizer.user) %></strong>
37+
<% end %>
3638
</p>
3739
</div>
3840
<div>

config/locales/en.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,9 @@ en:
702702
events:
703703
create:
704704
success: Event was created successfully.
705+
failure: Event was not created.
706+
edit:
707+
edit_event: Edit Event
705708
index:
706709
description: "Description"
707710
events: "Events"
@@ -726,6 +729,9 @@ en:
726729
organized_by: "Organized by"
727730
past: "Event is in the past."
728731
when: "When"
732+
update:
733+
success: "The event was successfully updated."
734+
failure: "The event was not updated."
729735
friendships:
730736
make_friend:
731737
heading: "Add %{user} as a friend?"
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class CreateEventOrganizers < ActiveRecord::Migration[7.0]
2+
def change
3+
create_table :event_organizers do |t|
4+
t.references :event, :foreign_key => true, :null => false, :index => true
5+
t.references :user, :foreign_key => true, :null => false, :index => true
6+
7+
t.timestamps
8+
end
9+
end
10+
end

db/structure.sql

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,38 @@ CREATE TABLE public.diary_entry_subscriptions (
777777
);
778778

779779

780+
--
781+
-- Name: event_organizers; Type: TABLE; Schema: public; Owner: -
782+
--
783+
784+
CREATE TABLE public.event_organizers (
785+
id bigint NOT NULL,
786+
event_id bigint NOT NULL,
787+
user_id bigint NOT NULL,
788+
created_at timestamp(6) without time zone NOT NULL,
789+
updated_at timestamp(6) without time zone NOT NULL
790+
);
791+
792+
793+
--
794+
-- Name: event_organizers_id_seq; Type: SEQUENCE; Schema: public; Owner: -
795+
--
796+
797+
CREATE SEQUENCE public.event_organizers_id_seq
798+
START WITH 1
799+
INCREMENT BY 1
800+
NO MINVALUE
801+
NO MAXVALUE
802+
CACHE 1;
803+
804+
805+
--
806+
-- Name: event_organizers_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
807+
--
808+
809+
ALTER SEQUENCE public.event_organizers_id_seq OWNED BY public.event_organizers.id;
810+
811+
780812
--
781813
-- Name: events; Type: TABLE; Schema: public; Owner: -
782814
--
@@ -1820,6 +1852,13 @@ ALTER TABLE ONLY public.diary_comments ALTER COLUMN id SET DEFAULT nextval('publ
18201852
ALTER TABLE ONLY public.diary_entries ALTER COLUMN id SET DEFAULT nextval('public.diary_entries_id_seq'::regclass);
18211853

18221854

1855+
--
1856+
-- Name: event_organizers id; Type: DEFAULT; Schema: public; Owner: -
1857+
--
1858+
1859+
ALTER TABLE ONLY public.event_organizers ALTER COLUMN id SET DEFAULT nextval('public.event_organizers_id_seq'::regclass);
1860+
1861+
18231862
--
18241863
-- Name: events id; Type: DEFAULT; Schema: public; Owner: -
18251864
--
@@ -2151,6 +2190,14 @@ ALTER TABLE ONLY public.diary_entry_subscriptions
21512190
ADD CONSTRAINT diary_entry_subscriptions_pkey PRIMARY KEY (user_id, diary_entry_id);
21522191

21532192

2193+
--
2194+
-- Name: event_organizers event_organizers_pkey; Type: CONSTRAINT; Schema: public; Owner: -
2195+
--
2196+
2197+
ALTER TABLE ONLY public.event_organizers
2198+
ADD CONSTRAINT event_organizers_pkey PRIMARY KEY (id);
2199+
2200+
21542201
--
21552202
-- Name: events events_pkey; Type: CONSTRAINT; Schema: public; Owner: -
21562203
--
@@ -2715,6 +2762,20 @@ CREATE INDEX index_community_members_on_user_id ON public.community_members USIN
27152762
CREATE INDEX index_diary_entry_subscriptions_on_diary_entry_id ON public.diary_entry_subscriptions USING btree (diary_entry_id);
27162763

27172764

2765+
--
2766+
-- Name: index_event_organizers_on_event_id; Type: INDEX; Schema: public; Owner: -
2767+
--
2768+
2769+
CREATE INDEX index_event_organizers_on_event_id ON public.event_organizers USING btree (event_id);
2770+
2771+
2772+
--
2773+
-- Name: index_event_organizers_on_user_id; Type: INDEX; Schema: public; Owner: -
2774+
--
2775+
2776+
CREATE INDEX index_event_organizers_on_user_id ON public.event_organizers USING btree (user_id);
2777+
2778+
27182779
--
27192780
-- Name: index_events_on_community_id; Type: INDEX; Schema: public; Owner: -
27202781
--
@@ -3346,6 +3407,14 @@ ALTER TABLE ONLY public.active_storage_variant_records
33463407
ADD CONSTRAINT fk_rails_993965df05 FOREIGN KEY (blob_id) REFERENCES public.active_storage_blobs(id);
33473408

33483409

3410+
--
3411+
-- Name: event_organizers fk_rails_b1c2c61554; Type: FK CONSTRAINT; Schema: public; Owner: -
3412+
--
3413+
3414+
ALTER TABLE ONLY public.event_organizers
3415+
ADD CONSTRAINT fk_rails_b1c2c61554 FOREIGN KEY (user_id) REFERENCES public.users(id);
3416+
3417+
33493418
--
33503419
-- Name: oauth_access_grants fk_rails_b4b53e07b8; Type: FK CONSTRAINT; Schema: public; Owner: -
33513420
--
@@ -3354,6 +3423,14 @@ ALTER TABLE ONLY public.oauth_access_grants
33543423
ADD CONSTRAINT fk_rails_b4b53e07b8 FOREIGN KEY (application_id) REFERENCES public.oauth_applications(id) NOT VALID;
33553424

33563425

3426+
--
3427+
-- Name: event_organizers fk_rails_c1e082c91e; Type: FK CONSTRAINT; Schema: public; Owner: -
3428+
--
3429+
3430+
ALTER TABLE ONLY public.event_organizers
3431+
ADD CONSTRAINT fk_rails_c1e082c91e FOREIGN KEY (event_id) REFERENCES public.events(id);
3432+
3433+
33573434
--
33583435
-- Name: active_storage_attachments fk_rails_c3b3935057; Type: FK CONSTRAINT; Schema: public; Owner: -
33593436
--
@@ -3764,6 +3841,7 @@ INSERT INTO "schema_migrations" (version) VALUES
37643841
('20220821143545'),
37653842
('20220925043305'),
37663843
('20221008144036'),
3844+
('20221008224134'),
37673845
('21'),
37683846
('22'),
37693847
('23'),

test/controllers/events_controller_test.rb

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,68 @@ def controller_mock.render(_partial)
207207
# assert_equal I18n.t("events.create.failure"), flash[:alert]
208208
end
209209

210+
def test_update_as_organizer
211+
# arrange
212+
cm = create(:community_member, :organizer)
213+
session_for(cm.user)
214+
e1 = create(:event, :community => cm.community) # original object
215+
e2 = build(:event, :community => cm.community) # new data
216+
# act
217+
put event_url(e1), :params => { :event => e2.as_json }, :xhr => true
218+
# assert
219+
assert_redirected_to event_path(e1)
220+
# TODO: Is it better to use t() to translate?
221+
assert_equal "The event was successfully updated.", flash[:notice]
222+
e1.reload
223+
# Assign the id of e1 to e2, so we can do an equality test easily.
224+
e2.id = e1.id
225+
assert_equal(e2, e1)
226+
end
227+
228+
def test_update_as_non_organizer
229+
# arrange
230+
cm = create(:community_member)
231+
session_for(cm.user)
232+
e1 = create(:event, :community => cm.community) # original object
233+
e2 = build(:event, :community => cm.community) # new data
234+
# act
235+
put event_url(e1), :params => { :event => e2.as_json }, :xhr => true
236+
# assert
237+
assert_redirected_to :controller => :errors, :action => :forbidden
238+
end
239+
240+
def test_update_put_failure
241+
# arrange
242+
cm = create(:community_member, :organizer)
243+
session_for(cm.user)
244+
ev = create(:event, :community => cm.community)
245+
def ev.update(_params)
246+
false
247+
end
248+
249+
controller_mock = EventsController.new
250+
def controller_mock.set_event
251+
@event = Event.new
252+
end
253+
254+
def controller_mock.render(_partial)
255+
# Can't do assert_equal here.
256+
# assert_equal :edit, partial
257+
end
258+
259+
# act
260+
EventsController.stub :new, controller_mock do
261+
Event.stub :new, ev do
262+
assert_difference "Event.count", 0 do
263+
put event_url(ev), :params => { :event => ev.as_json }, :xhr => true
264+
end
265+
end
266+
end
267+
268+
# assert
269+
assert_equal I18n.t("events.update.failure"), flash[:alert]
270+
end
271+
210272
def test_in_past_warns
211273
# arrange
212274
cm = create(:community_member, :organizer)

0 commit comments

Comments
 (0)