From 91b35d068c19f846d11c63ca7a6db457fa7a4690 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Mon, 2 Feb 2015 15:58:34 +1100 Subject: [PATCH] Adding owner to groups Groups have owners and users own groups. The owners are displayed and changable on the group's page by admin users. --- .../enterprise_groups/enterprise_groups.js.coffee | 2 +- app/models/enterprise_group.rb | 2 ++ app/models/spree/user_decorator.rb | 1 + app/views/admin/enterprise_groups/_inputs.html.haml | 10 ++++++++++ app/views/admin/enterprise_groups/index.html.haml | 4 ++++ .../20150202000203_add_owner_to_enterprise_groups.rb | 6 ++++++ db/schema.rb | 4 +++- spec/models/spree/user_spec.rb | 12 ++++++++++++ 8 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20150202000203_add_owner_to_enterprise_groups.rb diff --git a/app/assets/javascripts/admin/enterprise_groups/enterprise_groups.js.coffee b/app/assets/javascripts/admin/enterprise_groups/enterprise_groups.js.coffee index 2d23b9c6fa..e8e462d998 100644 --- a/app/assets/javascripts/admin/enterprise_groups/enterprise_groups.js.coffee +++ b/app/assets/javascripts/admin/enterprise_groups/enterprise_groups.js.coffee @@ -1 +1 @@ -angular.module("admin.enterprise_groups", ["admin.side_menu"]) +angular.module("admin.enterprise_groups", ["admin.side_menu", "admin.users"]) diff --git a/app/models/enterprise_group.rb b/app/models/enterprise_group.rb index 2b374c8687..4c9e97adb9 100644 --- a/app/models/enterprise_group.rb +++ b/app/models/enterprise_group.rb @@ -2,6 +2,7 @@ class EnterpriseGroup < ActiveRecord::Base acts_as_list has_and_belongs_to_many :enterprises + belongs_to :owner, class_name: 'Spree::User', foreign_key: :owner_id, inverse_of: :owned_groups belongs_to :address, :class_name => 'Spree::Address' accepts_nested_attributes_for :address validates :address, presence: true, associated: true @@ -11,6 +12,7 @@ class EnterpriseGroup < ActiveRecord::Base validates :description, presence: true attr_accessible :name, :description, :long_description, :on_front_page, :enterprise_ids + attr_accessible :owner_id attr_accessible :logo, :promo_image attr_accessible :address_attributes attr_accessible :email, :website, :facebook, :instagram, :linkedin, :twitter diff --git a/app/models/spree/user_decorator.rb b/app/models/spree/user_decorator.rb index 4f119ab81b..58c962985b 100644 --- a/app/models/spree/user_decorator.rb +++ b/app/models/spree/user_decorator.rb @@ -2,6 +2,7 @@ Spree.user_class.class_eval do has_many :enterprise_roles, :dependent => :destroy has_many :enterprises, through: :enterprise_roles has_many :owned_enterprises, class_name: 'Enterprise', foreign_key: :owner_id, inverse_of: :owner + has_many :owned_groups, class_name: 'EnterpriseGroup', foreign_key: :owner_id, inverse_of: :owner has_one :cart accepts_nested_attributes_for :enterprise_roles, :allow_destroy => true diff --git a/app/views/admin/enterprise_groups/_inputs.html.haml b/app/views/admin/enterprise_groups/_inputs.html.haml index 8b2db582a9..60181e09c4 100644 --- a/app/views/admin/enterprise_groups/_inputs.html.haml +++ b/app/views/admin/enterprise_groups/_inputs.html.haml @@ -10,6 +10,16 @@ %br/ = f.text_field :description + - if spree_current_user.admin? + .row + .three.columns.alpha + =f.label :owner_id, 'Owner' + .with-tip{'data-powertip' => "The primary user responsible for this group."} + %a What's this? + .eight.columns.omega + - owner_email = @enterprise_group.andand.owner.andand.email || "" + = f.hidden_field :owner_id, class: "select2 fullwidth", 'ofn-user-autocomplete' => true, email: owner_email + = f.field_container :on_front_page do = f.label :on_front_page, 'On front page?' %br/ diff --git a/app/views/admin/enterprise_groups/index.html.haml b/app/views/admin/enterprise_groups/index.html.haml index 035402267f..3bbf21db6e 100644 --- a/app/views/admin/enterprise_groups/index.html.haml +++ b/app/views/admin/enterprise_groups/index.html.haml @@ -9,6 +9,8 @@ %thead %tr %th Name + - if spree_current_user.admin? + %th Owner %th On front page? %th Enterprises %th.actions @@ -17,6 +19,8 @@ - @enterprise_groups.each do |enterprise_group| %tr %td.name= enterprise_group.name + - if spree_current_user.admin? + %td= enterprise_group.owner.andand.email || "" %td= enterprise_group.on_front_page ? 'Y' : 'N' %td= enterprise_group.enterprises.map(&:name).join ', ' %td.actions diff --git a/db/migrate/20150202000203_add_owner_to_enterprise_groups.rb b/db/migrate/20150202000203_add_owner_to_enterprise_groups.rb new file mode 100644 index 0000000000..82ffdf9f5d --- /dev/null +++ b/db/migrate/20150202000203_add_owner_to_enterprise_groups.rb @@ -0,0 +1,6 @@ +class AddOwnerToEnterpriseGroups < ActiveRecord::Migration + def change + add_column :enterprise_groups, :owner_id, :integer + add_foreign_key :enterprise_groups, :spree_users, name: "enterprise_groups_owner_id_fk", column: "owner_id" + end +end diff --git a/db/schema.rb b/db/schema.rb index 418f5a7943..c92989be2f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20150121030627) do +ActiveRecord::Schema.define(:version => 20150202000203) do create_table "adjustment_metadata", :force => true do |t| t.integer "adjustment_id" @@ -204,6 +204,7 @@ ActiveRecord::Schema.define(:version => 20150121030627) do t.string "instagram" t.string "linkedin" t.string "twitter" + t.integer "owner_id" end create_table "enterprise_groups_enterprises", :id => false, :force => true do |t| @@ -1085,6 +1086,7 @@ ActiveRecord::Schema.define(:version => 20150121030627) do add_foreign_key "enterprise_fees", "enterprises", name: "enterprise_fees_enterprise_id_fk" add_foreign_key "enterprise_groups", "spree_addresses", name: "enterprise_groups_address_id_fk", column: "address_id" + add_foreign_key "enterprise_groups", "spree_users", name: "enterprise_groups_owner_id_fk", column: "owner_id" add_foreign_key "enterprise_groups_enterprises", "enterprise_groups", name: "enterprise_groups_enterprises_enterprise_group_id_fk" add_foreign_key "enterprise_groups_enterprises", "enterprises", name: "enterprise_groups_enterprises_enterprise_id_fk" diff --git a/spec/models/spree/user_spec.rb b/spec/models/spree/user_spec.rb index e1a9239c95..46fb0d924b 100644 --- a/spec/models/spree/user_spec.rb +++ b/spec/models/spree/user_spec.rb @@ -22,6 +22,18 @@ describe Spree.user_class do }.to raise_error ActiveRecord::RecordInvalid, "Validation failed: #{u2.email} is not permitted to own any more enterprises (limit is 1)." end end + + describe "group ownership" do + let(:u1) { create(:user) } + let(:u2) { create(:user) } + let!(:g1) { create(:enterprise_group, owner: u1) } + let!(:g2) { create(:enterprise_group, owner: u1) } + + it "provides access to owned groups" do + expect(u1.owned_groups(:reload)).to include g1, g2 + end + + end end context "#create" do