Commit aea79b80351109506bd089694df6f22785456f68

Authored by Dmitriy Zaporozhets
1 parent aca6be50

Add ability rule for creating project in namespace

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
app/models/ability.rb
... ... @@ -188,6 +188,13 @@ class Ability
188 188 rules << :read_group
189 189 end
190 190  
  191 + # Only group masters and group owners can create new projects in group
  192 + if group.has_master?(user) || group.has_owner?(user) || user.admin?
  193 + rules += [
  194 + :create_projects,
  195 + ]
  196 + end
  197 +
191 198 # Only group owner and administrators can manage group
192 199 if group.has_owner?(user) || user.admin?
193 200 rules += [
... ... @@ -205,6 +212,7 @@ class Ability
205 212 # Only namespace owner and administrators can manage it
206 213 if namespace.owner == user || user.admin?
207 214 rules += [
  215 + :create_projects,
208 216 :manage_namespace
209 217 ]
210 218 end
... ...
app/models/group.rb
... ... @@ -26,7 +26,7 @@ class Group &lt; Namespace
26 26 validates :avatar, file_size: { maximum: 100.kilobytes.to_i }
27 27  
28 28 mount_uploader :avatar, AttachmentUploader
29   -
  29 +
30 30 def self.accessible_to(user)
31 31 accessible_ids = Project.accessible_to(user).pluck(:namespace_id)
32 32 accessible_ids += user.groups.pluck(:id) if user
... ... @@ -60,6 +60,10 @@ class Group &lt; Namespace
60 60 owners.include?(user)
61 61 end
62 62  
  63 + def has_master?(user)
  64 + members.masters.where(user_id: user).any?
  65 + end
  66 +
63 67 def last_owner?(user)
64 68 has_owner?(user) && owners.size == 1
65 69 end
... ...
app/models/project.rb
... ... @@ -387,10 +387,6 @@ class Project &lt; ActiveRecord::Base
387 387 end
388 388 end
389 389  
390   - def transfer(new_namespace)
391   - ProjectTransferService.new.transfer(self, new_namespace)
392   - end
393   -
394 390 def execute_hooks(data, hooks_scope = :push_hooks)
395 391 hooks.send(hooks_scope).each do |hook|
396 392 hook.async_execute(data)
... ...
app/models/user.rb
... ... @@ -90,6 +90,8 @@ class User &lt; ActiveRecord::Base
90 90 has_many :users_groups, dependent: :destroy
91 91 has_many :groups, through: :users_groups
92 92 has_many :owned_groups, -> { where users_groups: { group_access: UsersGroup::OWNER } }, through: :users_groups, source: :group
  93 + has_many :masters_groups, -> { where users_groups: { group_access: UsersGroup::MASTER } }, through: :users_groups, source: :group
  94 +
93 95 # Projects
94 96 has_many :groups_projects, through: :groups, source: :projects
95 97 has_many :personal_projects, through: :namespace, source: :projects
... ...