From b339e1904380afd6f2fea44af07d2513c476c834 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Poujade Date: Tue, 24 Nov 2015 20:54:14 -0500 Subject: [PATCH 01/21] Create members model, add members to admin dashboard --- app/controllers/admin/members_controller.rb | 19 +++++++ app/dashboards/dashboard_manifest.rb | 3 +- app/dashboards/member_dashboard.rb | 62 +++++++++++++++++++++ app/models/event.rb | 1 + app/models/member.rb | 5 ++ app/models/organization.rb | 2 + app/models/user.rb | 2 + db/migrate/20151125011253_create_members.rb | 14 +++++ db/schema.rb | 42 +++++++++++++- spec/factories/members.rb | 11 ++++ spec/models/member_spec.rb | 5 ++ 11 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 app/controllers/admin/members_controller.rb create mode 100644 app/dashboards/member_dashboard.rb create mode 100644 app/models/member.rb create mode 100644 db/migrate/20151125011253_create_members.rb create mode 100644 spec/factories/members.rb create mode 100644 spec/models/member_spec.rb diff --git a/app/controllers/admin/members_controller.rb b/app/controllers/admin/members_controller.rb new file mode 100644 index 00000000..7b3d6a70 --- /dev/null +++ b/app/controllers/admin/members_controller.rb @@ -0,0 +1,19 @@ +module Admin + class MembersController < Admin::ApplicationController + # To customize the behavior of this controller, + # simply overwrite any of the RESTful actions. For example: + # + # def index + # super + # @resources = Member.all.paginate(10, params[:page]) + # end + + # Define a custom finder by overriding the `find_resource` method: + # def find_resource(param) + # Member.find_by!(slug: param) + # end + + # See https://administrate-docs.herokuapp.com/customizing_controller_actions + # for more information + end +end diff --git a/app/dashboards/dashboard_manifest.rb b/app/dashboards/dashboard_manifest.rb index 0f7b0ea8..de925a99 100644 --- a/app/dashboards/dashboard_manifest.rb +++ b/app/dashboards/dashboard_manifest.rb @@ -10,7 +10,8 @@ class DashboardManifest # Dashboards returned from this method must be Rails models for Administrate # to work correctly. DASHBOARDS = [ - :locations + :locations, + :members ] # `ROOT_DASHBOARD` diff --git a/app/dashboards/member_dashboard.rb b/app/dashboards/member_dashboard.rb new file mode 100644 index 00000000..969a65b7 --- /dev/null +++ b/app/dashboards/member_dashboard.rb @@ -0,0 +1,62 @@ +require "administrate/base_dashboard" + +class MemberDashboard < Administrate::BaseDashboard + # ATTRIBUTE_TYPES + # a hash that describes the type of each of the model's fields. + # + # Each different type represents an Administrate::Field object, + # which determines how the attribute is displayed + # on pages throughout the dashboard. + ATTRIBUTE_TYPES = { + events: Field::HasMany, + organizations: Field::HasMany, + user: Field::HasOne, + id: Field::Number, + name: Field::String, + email: Field::String, + picture: Field::String.with_options(searchable: false), + twitter_handle: Field::String, + github_handle: Field::String, + biography: Field::Text, + created_at: Field::DateTime, + updated_at: Field::DateTime, + } + + # COLLECTION_ATTRIBUTES + # an array of attributes that will be displayed on the model's index page. + # + # By default, it's limited to four items to reduce clutter on index pages. + # Feel free to add, remove, or rearrange items. + COLLECTION_ATTRIBUTES = [ + :events, + :organizations, + :user, + :id, + ] + + # SHOW_PAGE_ATTRIBUTES + # an array of attributes that will be displayed on the model's show page. + SHOW_PAGE_ATTRIBUTES = ATTRIBUTE_TYPES.keys + + # FORM_ATTRIBUTES + # an array of attributes that will be displayed + # on the model's form (`new` and `edit`) pages. + FORM_ATTRIBUTES = [ + :events, + :organizations, + :user, + :name, + :email, + :picture, + :twitter_handle, + :github_handle, + :biography, + ] + + # Overwrite this method to customize how members are displayed + # across all pages of the admin dashboard. + # + # def display_resource(member) + # "Member ##{member.id}" + # end +end diff --git a/app/models/event.rb b/app/models/event.rb index fbc936f2..615c8670 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -11,6 +11,7 @@ class Event < ActiveRecord::Base belongs_to :location + has_many :members def self.published order(starts_at: :desc) diff --git a/app/models/member.rb b/app/models/member.rb new file mode 100644 index 00000000..e281f882 --- /dev/null +++ b/app/models/member.rb @@ -0,0 +1,5 @@ +class Member < ActiveRecord::Base + has_many :events + has_many :organizations + has_one :user +end diff --git a/app/models/organization.rb b/app/models/organization.rb index 39469490..cc817920 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -3,4 +3,6 @@ class Organization < ActiveRecord::Base mount_uploader :logo, LogoUploader validates :name, uniqueness: true, presence: true + + has_many :members end diff --git a/app/models/user.rb b/app/models/user.rb index d0f6db8b..83b14006 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -22,4 +22,6 @@ class User < ActiveRecord::Base # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable + + has_one :member end diff --git a/db/migrate/20151125011253_create_members.rb b/db/migrate/20151125011253_create_members.rb new file mode 100644 index 00000000..372dc703 --- /dev/null +++ b/db/migrate/20151125011253_create_members.rb @@ -0,0 +1,14 @@ +class CreateMembers < ActiveRecord::Migration + def change + create_table :members do |t| + t.string :name + t.string :email + t.binary :picture + t.string :twitter_handle + t.string :github_handle + t.text :biography + + t.timestamps null: false + end + end +end diff --git a/db/schema.rb b/db/schema.rb index c323e05e..75a0f870 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,10 +11,19 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20151124183742) do +ActiveRecord::Schema.define(version: 20151125011253) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + enable_extension "hstore" + + create_table "companies", force: :cascade do |t| + t.string "name", null: false + t.string "address" + t.string "logo" + t.datetime "created_at" + t.datetime "updated_at" + end create_table "company_translations", force: :cascade do |t| t.integer "company_id", null: false @@ -71,6 +80,17 @@ t.datetime "updated_at" end + create_table "members", force: :cascade do |t| + t.string "name" + t.string "email" + t.binary "picture" + t.string "twitter_handle" + t.string "github_handle" + t.text "biography" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "organizations", force: :cascade do |t| t.string "name", null: false t.string "address" @@ -79,6 +99,16 @@ t.datetime "updated_at" end + create_table "talks", force: :cascade do |t| + t.string "title" + t.text "description" + t.text "bio" + t.string "slides" + t.integer "author_id" + t.datetime "created_at" + t.datetime "updated_at" + end + create_table "users", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false @@ -97,4 +127,14 @@ add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree + create_table "votes", force: :cascade do |t| + t.integer "votable_id" + t.string "votable_type" + t.integer "user_id" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "votes", ["votable_id", "votable_type"], name: "index_votes_on_votable_id_and_votable_type", using: :btree + end diff --git a/spec/factories/members.rb b/spec/factories/members.rb new file mode 100644 index 00000000..39bf7d3a --- /dev/null +++ b/spec/factories/members.rb @@ -0,0 +1,11 @@ +FactoryGirl.define do + factory :member do + name "MyString" +email "MyString" +picture "" +twitter_handle "MyString" +github_handle "MyString" +biography "MyText" + end + +end diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb new file mode 100644 index 00000000..de08dabb --- /dev/null +++ b/spec/models/member_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Member, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end From 0c5d6d5785fb655465de8b94fac78cc8c1af11d9 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Poujade Date: Tue, 24 Nov 2015 21:11:30 -0500 Subject: [PATCH 02/21] Validate presence of name, email and uniqueness of email --- app/models/member.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/models/member.rb b/app/models/member.rb index e281f882..fb6adc01 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -2,4 +2,7 @@ class Member < ActiveRecord::Base has_many :events has_many :organizations has_one :user + + validates :name, :email, presence: true + validates :email, uniqueness: true end From 7213be9486577298089af50871b8e926cfd8df0a Mon Sep 17 00:00:00 2001 From: Pierre-Yves Poujade Date: Tue, 24 Nov 2015 21:43:11 -0500 Subject: [PATCH 03/21] Add tests for member --- spec/models/member_spec.rb | 39 +++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb index de08dabb..f8565d35 100644 --- a/spec/models/member_spec.rb +++ b/spec/models/member_spec.rb @@ -1,5 +1,42 @@ require 'rails_helper' RSpec.describe Member, type: :model do - pending "add some examples to (or delete) #{__FILE__}" + context "without a name" do + it "should not create a member" do + member = Member.new + + member.email = 'gala@example.com' + member.save + + expect(member.valid?).to be false + end + end + + context "without an email" do + it "should not create a member" do + member = Member.new + + member.name = 'Zaba' + member.save + + expect(member.valid?).to be false + end + end + + context "with a duplicate email" do + it "should not create a member" do + member1 = Member.new + member1.name = 'Zaba' + member1.email = 'gala@example.com' + + member2 = Member.new + member2.name = 'Gala' + member2.email = 'gala@example.com' + + member1.save + member2.save + + expect(member2.valid?).to be false + end + end end From f575d2f414193f2fc58e104a98cc9ce306df4cfb Mon Sep 17 00:00:00 2001 From: Pierre-Yves Poujade Date: Tue, 24 Nov 2015 20:54:14 -0500 Subject: [PATCH 04/21] Create members model, add members to admin dashboard --- app/dashboards/dashboard_manifest.rb | 3 ++- app/models/event.rb | 6 ++++++ app/models/organization.rb | 1 + app/models/user.rb | 2 ++ db/schema.rb | 11 +++++++++++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/app/dashboards/dashboard_manifest.rb b/app/dashboards/dashboard_manifest.rb index c2151339..9d119ed6 100644 --- a/app/dashboards/dashboard_manifest.rb +++ b/app/dashboards/dashboard_manifest.rb @@ -16,7 +16,8 @@ class DashboardManifest :locations, :jobs, :organizations, - :pages + :pages, + :members ].freeze # `ROOT_DASHBOARD` diff --git a/app/models/event.rb b/app/models/event.rb index 4fe661e6..04c5f99b 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -23,6 +23,12 @@ class Event < ActiveRecord::Base scope :published, -> { where(state: "scheduled").order(starts_at: :desc) } + has_many :members + + def self.published + order(starts_at: :desc) + end + def title_with_date date = starts_at.strftime("%B %d") [title, date].join(" : ") diff --git a/app/models/organization.rb b/app/models/organization.rb index 295464e9..22464264 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -6,4 +6,5 @@ class Organization < ActiveRecord::Base validates :name, uniqueness: true, presence: true has_many :members + has_many :jobs end diff --git a/app/models/user.rb b/app/models/user.rb index a7fa5eff..9fea8894 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -53,4 +53,6 @@ def self.default_user def active_for_authentication? super && email != DEFAULT_USER_EMAIL end + + has_one :member end diff --git a/db/schema.rb b/db/schema.rb index 12687def..39ac94a7 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -86,6 +86,17 @@ t.datetime "updated_at" end + create_table "members", force: :cascade do |t| + t.string "name" + t.string "email" + t.binary "picture" + t.string "twitter_handle" + t.string "github_handle" + t.text "biography" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "news_items", force: :cascade do |t| t.string "state" t.datetime "published_at" From c62ab253e194a0e493f35b42605a6c6ca06b7233 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Poujade Date: Tue, 24 Nov 2015 22:04:53 -0500 Subject: [PATCH 05/21] Fix indent --- spec/factories/members.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spec/factories/members.rb b/spec/factories/members.rb index 39bf7d3a..6267ebe7 100644 --- a/spec/factories/members.rb +++ b/spec/factories/members.rb @@ -1,11 +1,11 @@ FactoryGirl.define do factory :member do name "MyString" -email "MyString" -picture "" -twitter_handle "MyString" -github_handle "MyString" -biography "MyText" + email "MyString" + picture "" + twitter_handle "MyString" + github_handle "MyString" + biography "MyText" end end From 9be67b4ce8f54d714ca311802810c043a89080b1 Mon Sep 17 00:00:00 2001 From: Gala Date: Wed, 2 Dec 2015 19:59:47 -0500 Subject: [PATCH 06/21] Refactor tests --- spec/models/member_spec.rb | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb index f8565d35..35767489 100644 --- a/spec/models/member_spec.rb +++ b/spec/models/member_spec.rb @@ -2,29 +2,27 @@ RSpec.describe Member, type: :model do context "without a name" do - it "should not create a member" do + it "should be invalid" do member = Member.new member.email = 'gala@example.com' - member.save - expect(member.valid?).to be false + expect(member).to be_invalid end end context "without an email" do - it "should not create a member" do + it "should be invalid" do member = Member.new member.name = 'Zaba' - member.save - expect(member.valid?).to be false + expect(member).to be_invalid end end context "with a duplicate email" do - it "should not create a member" do + it "should be invalid" do member1 = Member.new member1.name = 'Zaba' member1.email = 'gala@example.com' @@ -34,9 +32,8 @@ member2.email = 'gala@example.com' member1.save - member2.save - expect(member2.valid?).to be false + expect(member2).to be_invalid end end end From 1cce2a20d9610f92e9c99f75bf2ff14f795f8420 Mon Sep 17 00:00:00 2001 From: Gala Date: Wed, 2 Dec 2015 20:48:07 -0500 Subject: [PATCH 07/21] Enforce non-null email at db level --- db/migrate/20151203012632_add_null_constraint_to_email.rb | 5 +++++ db/schema.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20151203012632_add_null_constraint_to_email.rb diff --git a/db/migrate/20151203012632_add_null_constraint_to_email.rb b/db/migrate/20151203012632_add_null_constraint_to_email.rb new file mode 100644 index 00000000..f1512378 --- /dev/null +++ b/db/migrate/20151203012632_add_null_constraint_to_email.rb @@ -0,0 +1,5 @@ +class AddNullConstraintToEmail < ActiveRecord::Migration + def change + change_column_null :members, :email, false + end +end diff --git a/db/schema.rb b/db/schema.rb index 39ac94a7..4244ff1a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -88,7 +88,7 @@ create_table "members", force: :cascade do |t| t.string "name" - t.string "email" + t.string "email", null: false t.binary "picture" t.string "twitter_handle" t.string "github_handle" From da54a56bc1dc6465fb07887c4368cec26b8748bc Mon Sep 17 00:00:00 2001 From: Gala Date: Wed, 2 Dec 2015 22:50:16 -0500 Subject: [PATCH 08/21] Add foreign key to users --- app/models/user.rb | 2 +- db/migrate/20151203031902_add_foreign_key_to_users.rb | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20151203031902_add_foreign_key_to_users.rb diff --git a/app/models/user.rb b/app/models/user.rb index 9fea8894..ba9c3cc3 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -54,5 +54,5 @@ def active_for_authentication? super && email != DEFAULT_USER_EMAIL end - has_one :member + belongs_to :member end diff --git a/db/migrate/20151203031902_add_foreign_key_to_users.rb b/db/migrate/20151203031902_add_foreign_key_to_users.rb new file mode 100644 index 00000000..4a40efc8 --- /dev/null +++ b/db/migrate/20151203031902_add_foreign_key_to_users.rb @@ -0,0 +1,6 @@ +class AddForeignKeyToUsers < ActiveRecord::Migration + def change + add_column :users, :member_id, :integer + add_foreign_key :users, :members + end +end From df2a000853af92898f48d79bcb2f5d53d0cdd379 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Poujade Date: Sat, 5 Dec 2015 21:10:43 -0500 Subject: [PATCH 09/21] Move foreign key from Users to Members --- app/dashboards/member_dashboard.rb | 2 +- app/models/member.rb | 2 +- ...eign_key_from_users_and_add_foreign_key_to_members.rb | 9 +++++++++ db/schema.rb | 5 +++-- 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20151206020220_remove_foreign_key_from_users_and_add_foreign_key_to_members.rb diff --git a/app/dashboards/member_dashboard.rb b/app/dashboards/member_dashboard.rb index 969a65b7..1181b49f 100644 --- a/app/dashboards/member_dashboard.rb +++ b/app/dashboards/member_dashboard.rb @@ -10,7 +10,7 @@ class MemberDashboard < Administrate::BaseDashboard ATTRIBUTE_TYPES = { events: Field::HasMany, organizations: Field::HasMany, - user: Field::HasOne, + user: Field::BelongsTo, id: Field::Number, name: Field::String, email: Field::String, diff --git a/app/models/member.rb b/app/models/member.rb index fb6adc01..dfb1f608 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -1,7 +1,7 @@ class Member < ActiveRecord::Base has_many :events has_many :organizations - has_one :user + belongs_to :user validates :name, :email, presence: true validates :email, uniqueness: true diff --git a/db/migrate/20151206020220_remove_foreign_key_from_users_and_add_foreign_key_to_members.rb b/db/migrate/20151206020220_remove_foreign_key_from_users_and_add_foreign_key_to_members.rb new file mode 100644 index 00000000..e1e40bbe --- /dev/null +++ b/db/migrate/20151206020220_remove_foreign_key_from_users_and_add_foreign_key_to_members.rb @@ -0,0 +1,9 @@ +class RemoveForeignKeyFromUsersAndAddForeignKeyToMembers < ActiveRecord::Migration + def change + remove_foreign_key :users, :members + remove_column :users, :member_id + + add_column :members, :user_id, :integer + add_foreign_key :members, :users + end +end diff --git a/db/schema.rb b/db/schema.rb index 4244ff1a..ac654a8a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160308004823) do +ActiveRecord::Schema.define(version: 20151206020220) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -95,6 +95,7 @@ t.text "biography" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "user_id" end create_table "news_items", force: :cascade do |t| @@ -195,5 +196,5 @@ add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree add_index "users", ["uid"], name: "index_users_on_uid", using: :btree - add_foreign_key "talks", "events" + add_foreign_key "members", "users" end From 8c230e89a0fa3107f8d999a846bf3be9cfe817c8 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Poujade Date: Sat, 5 Dec 2015 21:43:48 -0500 Subject: [PATCH 10/21] Make houndci happy --- .../20151203012632_add_null_constraint_to_email.rb | 2 +- .../20151203031902_add_foreign_key_to_users.rb | 4 ++-- spec/factories/members.rb | 1 - spec/models/member_spec.rb | 14 +++++++------- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/db/migrate/20151203012632_add_null_constraint_to_email.rb b/db/migrate/20151203012632_add_null_constraint_to_email.rb index f1512378..2855d254 100644 --- a/db/migrate/20151203012632_add_null_constraint_to_email.rb +++ b/db/migrate/20151203012632_add_null_constraint_to_email.rb @@ -1,5 +1,5 @@ class AddNullConstraintToEmail < ActiveRecord::Migration def change - change_column_null :members, :email, false + change_column_null :members, :email, false end end diff --git a/db/migrate/20151203031902_add_foreign_key_to_users.rb b/db/migrate/20151203031902_add_foreign_key_to_users.rb index 4a40efc8..cb688cf5 100644 --- a/db/migrate/20151203031902_add_foreign_key_to_users.rb +++ b/db/migrate/20151203031902_add_foreign_key_to_users.rb @@ -1,6 +1,6 @@ class AddForeignKeyToUsers < ActiveRecord::Migration def change - add_column :users, :member_id, :integer - add_foreign_key :users, :members + add_column :users, :member_id, :integer + add_foreign_key :users, :members end end diff --git a/spec/factories/members.rb b/spec/factories/members.rb index 6267ebe7..f4cc2fd9 100644 --- a/spec/factories/members.rb +++ b/spec/factories/members.rb @@ -7,5 +7,4 @@ github_handle "MyString" biography "MyText" end - end diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb index 35767489..2082ac7d 100644 --- a/spec/models/member_spec.rb +++ b/spec/models/member_spec.rb @@ -1,11 +1,11 @@ -require 'rails_helper' +require "rails_helper" RSpec.describe Member, type: :model do context "without a name" do it "should be invalid" do member = Member.new - member.email = 'gala@example.com' + member.email = "gala@example.com" expect(member).to be_invalid end @@ -15,7 +15,7 @@ it "should be invalid" do member = Member.new - member.name = 'Zaba' + member.name = "Zaba" expect(member).to be_invalid end @@ -24,12 +24,12 @@ context "with a duplicate email" do it "should be invalid" do member1 = Member.new - member1.name = 'Zaba' - member1.email = 'gala@example.com' + member1.name = "Zaba" + member1.email = "gala@example.com" member2 = Member.new - member2.name = 'Gala' - member2.email = 'gala@example.com' + member2.name = "Gala" + member2.email = "gala@example.com" member1.save From e5e238c3d970dd47520c8d1bc051b1526098ca20 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Poujade Date: Sat, 5 Dec 2015 23:51:17 -0500 Subject: [PATCH 11/21] Split migration in two --- .../20151206020220_remove_foreign_key_from_users.rb | 6 ++++++ ...eign_key_from_users_and_add_foreign_key_to_members.rb | 9 --------- db/migrate/20151206044852_add_foreign_key_to_members.rb | 6 ++++++ 3 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 db/migrate/20151206020220_remove_foreign_key_from_users.rb delete mode 100644 db/migrate/20151206020220_remove_foreign_key_from_users_and_add_foreign_key_to_members.rb create mode 100644 db/migrate/20151206044852_add_foreign_key_to_members.rb diff --git a/db/migrate/20151206020220_remove_foreign_key_from_users.rb b/db/migrate/20151206020220_remove_foreign_key_from_users.rb new file mode 100644 index 00000000..79375254 --- /dev/null +++ b/db/migrate/20151206020220_remove_foreign_key_from_users.rb @@ -0,0 +1,6 @@ +class RemoveForeignKeyFromUsers < ActiveRecord::Migration + def change + remove_foreign_key :users, :members + remove_column :users, :member_id + end +end diff --git a/db/migrate/20151206020220_remove_foreign_key_from_users_and_add_foreign_key_to_members.rb b/db/migrate/20151206020220_remove_foreign_key_from_users_and_add_foreign_key_to_members.rb deleted file mode 100644 index e1e40bbe..00000000 --- a/db/migrate/20151206020220_remove_foreign_key_from_users_and_add_foreign_key_to_members.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemoveForeignKeyFromUsersAndAddForeignKeyToMembers < ActiveRecord::Migration - def change - remove_foreign_key :users, :members - remove_column :users, :member_id - - add_column :members, :user_id, :integer - add_foreign_key :members, :users - end -end diff --git a/db/migrate/20151206044852_add_foreign_key_to_members.rb b/db/migrate/20151206044852_add_foreign_key_to_members.rb new file mode 100644 index 00000000..277180b6 --- /dev/null +++ b/db/migrate/20151206044852_add_foreign_key_to_members.rb @@ -0,0 +1,6 @@ +class AddForeignKeyToMembers < ActiveRecord::Migration + def change + add_column :members, :user_id, :integer + add_foreign_key :members, :users + end +end From df1e15853d82e8843d25174e3b3debe5ed01dc44 Mon Sep 17 00:00:00 2001 From: Coaxial Date: Wed, 9 Mar 2016 20:03:31 -0500 Subject: [PATCH 12/21] Make hound happy again --- app/dashboards/member_dashboard.rb | 6 +++--- db/migrate/20151206044852_add_foreign_key_to_members.rb | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/dashboards/member_dashboard.rb b/app/dashboards/member_dashboard.rb index 1181b49f..17752ebb 100644 --- a/app/dashboards/member_dashboard.rb +++ b/app/dashboards/member_dashboard.rb @@ -20,7 +20,7 @@ class MemberDashboard < Administrate::BaseDashboard biography: Field::Text, created_at: Field::DateTime, updated_at: Field::DateTime, - } + }.freeze # COLLECTION_ATTRIBUTES # an array of attributes that will be displayed on the model's index page. @@ -32,7 +32,7 @@ class MemberDashboard < Administrate::BaseDashboard :organizations, :user, :id, - ] + ].freeze # SHOW_PAGE_ATTRIBUTES # an array of attributes that will be displayed on the model's show page. @@ -51,7 +51,7 @@ class MemberDashboard < Administrate::BaseDashboard :twitter_handle, :github_handle, :biography, - ] + ].freeze # Overwrite this method to customize how members are displayed # across all pages of the admin dashboard. diff --git a/db/migrate/20151206044852_add_foreign_key_to_members.rb b/db/migrate/20151206044852_add_foreign_key_to_members.rb index 277180b6..548b3902 100644 --- a/db/migrate/20151206044852_add_foreign_key_to_members.rb +++ b/db/migrate/20151206044852_add_foreign_key_to_members.rb @@ -1,6 +1,6 @@ class AddForeignKeyToMembers < ActiveRecord::Migration def change add_column :members, :user_id, :integer - add_foreign_key :members, :users + add_foreign_key :members, :users end end From 0cdfefdd0e50c81dc1f9d90e78f0e26db703b2fd Mon Sep 17 00:00:00 2001 From: Sophie Deziel Date: Wed, 9 Mar 2016 21:52:21 -0500 Subject: [PATCH 13/21] new schema --- db/schema.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index ac654a8a..5409b731 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20151206020220) do +ActiveRecord::Schema.define(version: 20160308004823) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -197,4 +197,5 @@ add_index "users", ["uid"], name: "index_users_on_uid", using: :btree add_foreign_key "members", "users" + add_foreign_key "talks", "events" end From 7cfabfffc2bdfcf628058da3aad44ad4ab497145 Mon Sep 17 00:00:00 2001 From: Sophie Deziel Date: Wed, 9 Mar 2016 22:06:20 -0500 Subject: [PATCH 14/21] fix the tests --- app/models/event.rb | 4 ---- spec/controllers/events_controller_spec.rb | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/app/models/event.rb b/app/models/event.rb index 04c5f99b..a119c7a3 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -25,10 +25,6 @@ class Event < ActiveRecord::Base has_many :members - def self.published - order(starts_at: :desc) - end - def title_with_date date = starts_at.strftime("%B %d") [title, date].join(" : ") diff --git a/spec/controllers/events_controller_spec.rb b/spec/controllers/events_controller_spec.rb index 62c3fd32..ac144544 100644 --- a/spec/controllers/events_controller_spec.rb +++ b/spec/controllers/events_controller_spec.rb @@ -1,8 +1,8 @@ require "rails_helper" RSpec.describe EventsController, type: :controller do - let(:proposed_event) { create(:event, :proposed) } - let(:scheduled_event) { create(:event, :scheduled) } + let!(:proposed_event) { create(:event, :proposed) } + let!(:scheduled_event) { create(:event, :scheduled) } describe "GET #index" do before :each do From 998e42bdd8278ef721a901f2f8a5a86ea7c714a9 Mon Sep 17 00:00:00 2001 From: Sophie Deziel Date: Wed, 9 Mar 2016 22:37:48 -0500 Subject: [PATCH 15/21] fix the creation of a new member in the admin panel --- app/dashboards/dashboard_manifest.rb | 3 ++- app/dashboards/member_dashboard.rb | 4 ++-- app/models/event.rb | 3 +-- app/models/member.rb | 4 ++-- app/models/organization.rb | 5 ++--- ..._relationship_between_members_and_events.rb | 8 ++++++++ ...ionship_between_members_and_organization.rb | 8 ++++++++ db/schema.rb | 18 +++++++++++++++++- 8 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 db/migrate/20160310032356_create_habtm_relationship_between_members_and_events.rb create mode 100644 db/migrate/20160310032845_habtm_relationship_between_members_and_organization.rb diff --git a/app/dashboards/dashboard_manifest.rb b/app/dashboards/dashboard_manifest.rb index 9d119ed6..4bff34d7 100644 --- a/app/dashboards/dashboard_manifest.rb +++ b/app/dashboards/dashboard_manifest.rb @@ -17,7 +17,8 @@ class DashboardManifest :jobs, :organizations, :pages, - :members + :members, + #:users, ].freeze # `ROOT_DASHBOARD` diff --git a/app/dashboards/member_dashboard.rb b/app/dashboards/member_dashboard.rb index 17752ebb..efad1a78 100644 --- a/app/dashboards/member_dashboard.rb +++ b/app/dashboards/member_dashboard.rb @@ -30,7 +30,7 @@ class MemberDashboard < Administrate::BaseDashboard COLLECTION_ATTRIBUTES = [ :events, :organizations, - :user, + #:user, :id, ].freeze @@ -44,7 +44,7 @@ class MemberDashboard < Administrate::BaseDashboard FORM_ATTRIBUTES = [ :events, :organizations, - :user, + #:user, :name, :email, :picture, diff --git a/app/models/event.rb b/app/models/event.rb index a119c7a3..a2fdad6f 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -7,6 +7,7 @@ class Event < ActiveRecord::Base belongs_to :location belongs_to :author, foreign_key: :user_id, class_name: "User" has_many :talks, -> { where(state: "scheduled") }, class_name: "Talk" + has_and_belongs_to_many :members to_param :title @@ -23,8 +24,6 @@ class Event < ActiveRecord::Base scope :published, -> { where(state: "scheduled").order(starts_at: :desc) } - has_many :members - def title_with_date date = starts_at.strftime("%B %d") [title, date].join(" : ") diff --git a/app/models/member.rb b/app/models/member.rb index dfb1f608..58025ec5 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -1,6 +1,6 @@ class Member < ActiveRecord::Base - has_many :events - has_many :organizations + has_and_belongs_to_many :events + has_and_belongs_to_many :organizations belongs_to :user validates :name, :email, presence: true diff --git a/app/models/organization.rb b/app/models/organization.rb index 22464264..3022fdde 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -1,10 +1,9 @@ class Organization < ActiveRecord::Base has_many :jobs + has_and_belongs_to_many :jobs + translates :description mount_uploader :logo, LogoUploader validates :name, uniqueness: true, presence: true - - has_many :members - has_many :jobs end diff --git a/db/migrate/20160310032356_create_habtm_relationship_between_members_and_events.rb b/db/migrate/20160310032356_create_habtm_relationship_between_members_and_events.rb new file mode 100644 index 00000000..72af03dc --- /dev/null +++ b/db/migrate/20160310032356_create_habtm_relationship_between_members_and_events.rb @@ -0,0 +1,8 @@ +class CreateHabtmRelationshipBetweenMembersAndEvents < ActiveRecord::Migration + def change + create_table :events_members do |t| + t.belongs_to :event, index: true + t.belongs_to :member, index: true + end + end +end diff --git a/db/migrate/20160310032845_habtm_relationship_between_members_and_organization.rb b/db/migrate/20160310032845_habtm_relationship_between_members_and_organization.rb new file mode 100644 index 00000000..c860a3e6 --- /dev/null +++ b/db/migrate/20160310032845_habtm_relationship_between_members_and_organization.rb @@ -0,0 +1,8 @@ +class HabtmRelationshipBetweenMembersAndOrganization < ActiveRecord::Migration + def change + create_table :members_organizations do |t| + t.belongs_to :organization, index: true + t.belongs_to :member, index: true + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 5409b731..c98bd63d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160308004823) do +ActiveRecord::Schema.define(version: 20160310032845) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -41,6 +41,14 @@ add_index "events", ["starts_at"], name: "index_events_on_starts_at", using: :btree add_index "events", ["user_id"], name: "index_events_on_user_id", using: :btree + create_table "events_members", force: :cascade do |t| + t.integer "event_id" + t.integer "member_id" + end + + add_index "events_members", ["event_id"], name: "index_events_members_on_event_id", using: :btree + add_index "events_members", ["member_id"], name: "index_events_members_on_member_id", using: :btree + create_table "friendly_id_slugs", force: :cascade do |t| t.string "slug", null: false t.integer "sluggable_id", null: false @@ -98,6 +106,14 @@ t.integer "user_id" end + create_table "members_organizations", force: :cascade do |t| + t.integer "organization_id" + t.integer "member_id" + end + + add_index "members_organizations", ["member_id"], name: "index_members_organizations_on_member_id", using: :btree + add_index "members_organizations", ["organization_id"], name: "index_members_organizations_on_organization_id", using: :btree + create_table "news_items", force: :cascade do |t| t.string "state" t.datetime "published_at" From 320bddf6b6aa03fe88758a8c4c6a198706c90998 Mon Sep 17 00:00:00 2001 From: Sophie Deziel Date: Wed, 9 Mar 2016 22:40:33 -0500 Subject: [PATCH 16/21] closes #8 From 0c66608e731864ee05966aedb0157e6cb9e91837 Mon Sep 17 00:00:00 2001 From: Sophie Deziel Date: Wed, 9 Mar 2016 22:52:46 -0500 Subject: [PATCH 17/21] last detail --- app/dashboards/member_dashboard.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/dashboards/member_dashboard.rb b/app/dashboards/member_dashboard.rb index efad1a78..d34bb483 100644 --- a/app/dashboards/member_dashboard.rb +++ b/app/dashboards/member_dashboard.rb @@ -10,7 +10,7 @@ class MemberDashboard < Administrate::BaseDashboard ATTRIBUTE_TYPES = { events: Field::HasMany, organizations: Field::HasMany, - user: Field::BelongsTo, + #user: Field::BelongsTo, id: Field::Number, name: Field::String, email: Field::String, From b89b768636945a0ae3388d96ef4261d1d1c88a30 Mon Sep 17 00:00:00 2001 From: Sophie Deziel Date: Wed, 9 Mar 2016 22:54:05 -0500 Subject: [PATCH 18/21] really hound? --- app/dashboards/member_dashboard.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/dashboards/member_dashboard.rb b/app/dashboards/member_dashboard.rb index d34bb483..3bbeb88e 100644 --- a/app/dashboards/member_dashboard.rb +++ b/app/dashboards/member_dashboard.rb @@ -10,7 +10,7 @@ class MemberDashboard < Administrate::BaseDashboard ATTRIBUTE_TYPES = { events: Field::HasMany, organizations: Field::HasMany, - #user: Field::BelongsTo, + # user: Field::BelongsTo, id: Field::Number, name: Field::String, email: Field::String, From d1921fe21c9603d3a9bcad0dd3ec49eed867738d Mon Sep 17 00:00:00 2001 From: Sophie Deziel Date: Thu, 17 Mar 2016 17:30:34 -0400 Subject: [PATCH 19/21] fix the user dependency --- app/controllers/admin/users_controller.rb | 19 +++++++++++++ app/dashboards/dashboard_manifest.rb | 2 +- app/dashboards/member_dashboard.rb | 10 ++----- app/dashboards/user_dashboard.rb | 28 ++----------------- app/models/user.rb | 3 +- db/schema.rb | 2 ++ .../admin/users_controller_spec.rb | 0 7 files changed, 29 insertions(+), 35 deletions(-) create mode 100644 app/controllers/admin/users_controller.rb create mode 100644 spec/controllers/admin/users_controller_spec.rb diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb new file mode 100644 index 00000000..bf8677a7 --- /dev/null +++ b/app/controllers/admin/users_controller.rb @@ -0,0 +1,19 @@ +module Admin + class UsersController < Admin::ApplicationController + # To customize the behavior of this controller, + # simply overwrite any of the RESTful actions. For example: + # + # def index + # super + # @resources = Member.all.paginate(10, params[:page]) + # end + + # Define a custom finder by overriding the `find_resource` method: + # def find_resource(param) + # Member.find_by!(slug: param) + # end + + # See https://administrate-docs.herokuapp.com/customizing_controller_actions + # for more information + end +end diff --git a/app/dashboards/dashboard_manifest.rb b/app/dashboards/dashboard_manifest.rb index 4bff34d7..ab9d48da 100644 --- a/app/dashboards/dashboard_manifest.rb +++ b/app/dashboards/dashboard_manifest.rb @@ -18,7 +18,7 @@ class DashboardManifest :organizations, :pages, :members, - #:users, + :users, ].freeze # `ROOT_DASHBOARD` diff --git a/app/dashboards/member_dashboard.rb b/app/dashboards/member_dashboard.rb index 3bbeb88e..ae4237ec 100644 --- a/app/dashboards/member_dashboard.rb +++ b/app/dashboards/member_dashboard.rb @@ -10,7 +10,7 @@ class MemberDashboard < Administrate::BaseDashboard ATTRIBUTE_TYPES = { events: Field::HasMany, organizations: Field::HasMany, - # user: Field::BelongsTo, + user: Field::BelongsTo, id: Field::Number, name: Field::String, email: Field::String, @@ -28,9 +28,7 @@ class MemberDashboard < Administrate::BaseDashboard # By default, it's limited to four items to reduce clutter on index pages. # Feel free to add, remove, or rearrange items. COLLECTION_ATTRIBUTES = [ - :events, - :organizations, - #:user, + :user, :id, ].freeze @@ -42,9 +40,7 @@ class MemberDashboard < Administrate::BaseDashboard # an array of attributes that will be displayed # on the model's form (`new` and `edit`) pages. FORM_ATTRIBUTES = [ - :events, - :organizations, - #:user, + :user, :name, :email, :picture, diff --git a/app/dashboards/user_dashboard.rb b/app/dashboards/user_dashboard.rb index 78067e7c..d8a140fd 100644 --- a/app/dashboards/user_dashboard.rb +++ b/app/dashboards/user_dashboard.rb @@ -8,21 +8,9 @@ class UserDashboard < Administrate::BaseDashboard # which determines how the attribute is displayed # on pages throughout the dashboard. ATTRIBUTE_TYPES = { - votes: Field::HasMany, id: Field::Number, email: Field::String, - encrypted_password: Field::String, - reset_password_token: Field::String, - reset_password_sent_at: Field::DateTime, - remember_created_at: Field::DateTime, - sign_in_count: Field::Number, - current_sign_in_at: Field::DateTime, - last_sign_in_at: Field::DateTime, - current_sign_in_ip: Field::String.with_options(searchable: false), - last_sign_in_ip: Field::String.with_options(searchable: false), - created_at: Field::DateTime, - updated_at: Field::DateTime, - bio: Field::String + member: Field::HasOne, }.freeze # COLLECTION_ATTRIBUTES @@ -31,10 +19,9 @@ class UserDashboard < Administrate::BaseDashboard # By default, it's limited to four items to reduce clutter on index pages. # Feel free to add, remove, or rearrange items. COLLECTION_ATTRIBUTES = [ - :votes, :id, :email, - :encrypted_password + :member, ].freeze # SHOW_PAGE_ATTRIBUTES @@ -45,18 +32,7 @@ class UserDashboard < Administrate::BaseDashboard # an array of attributes that will be displayed # on the model's form (`new` and `edit`) pages. FORM_ATTRIBUTES = [ - :votes, :email, - :encrypted_password, - :reset_password_token, - :reset_password_sent_at, - :remember_created_at, - :sign_in_count, - :current_sign_in_at, - :last_sign_in_at, - :current_sign_in_ip, - :last_sign_in_ip, - :bio ].freeze # Overwrite this method to customize how users are displayed diff --git a/app/models/user.rb b/app/models/user.rb index ba9c3cc3..99d804cd 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -25,6 +25,8 @@ class User < ActiveRecord::Base :recoverable, :rememberable, :trackable, :validatable, :omniauthable, omniauth_providers: [:github] + has_one :member + def self.from_omniauth(auth) where(provider: auth.provider, uid: auth.uid).first_or_create do |user| user.email = auth.info.email @@ -54,5 +56,4 @@ def active_for_authentication? super && email != DEFAULT_USER_EMAIL end - belongs_to :member end diff --git a/db/schema.rb b/db/schema.rb index c98bd63d..7e1b405f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -166,6 +166,8 @@ t.string "slug", default: "temporary-slug", null: false end + add_index "pages", ["slug"], name: "index_pages_on_slug", unique: true, using: :btree + create_table "talk_translations", force: :cascade do |t| t.integer "talk_id", null: false t.string "locale", null: false diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb new file mode 100644 index 00000000..e69de29b From 4414ea5ab1dce71e52278cebabea11e31532f754 Mon Sep 17 00:00:00 2001 From: Sophie Deziel Date: Thu, 17 Mar 2016 17:32:29 -0400 Subject: [PATCH 20/21] make hound happy --- app/models/user.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 99d804cd..a39df9a5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -55,5 +55,4 @@ def self.default_user def active_for_authentication? super && email != DEFAULT_USER_EMAIL end - end From 3d529b761fb51c2a817270d1e5333719df6d71db Mon Sep 17 00:00:00 2001 From: Sophie Deziel Date: Thu, 17 Mar 2016 17:40:08 -0400 Subject: [PATCH 21/21] add back events and organizations --- app/dashboards/member_dashboard.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/dashboards/member_dashboard.rb b/app/dashboards/member_dashboard.rb index ae4237ec..829058e4 100644 --- a/app/dashboards/member_dashboard.rb +++ b/app/dashboards/member_dashboard.rb @@ -47,6 +47,8 @@ class MemberDashboard < Administrate::BaseDashboard :twitter_handle, :github_handle, :biography, + :organizations, + :events, ].freeze # Overwrite this method to customize how members are displayed