summaryrefslogtreecommitdiff
path: root/app/models/ability.rb
diff options
context:
space:
mode:
authorskv-headless <skv-headless@yandex.ru>2014-06-14 14:05:25 +0400
committerskv-headless <skv-headless@yandex.ru>2014-06-14 14:05:25 +0400
commit8ec02ed9aa36160bd19155cef1f71ca7e12ad4f3 (patch)
tree626d134665a25f218e9e36d0b3753b8d5b9ce9ed /app/models/ability.rb
parenta5cbb4cb82a6911b5c1de117ae6ed4cbf667a679 (diff)
downloadgitlab-ce-8ec02ed9aa36160bd19155cef1f71ca7e12ad4f3.tar.gz
per request project rules caching
Diffstat (limited to 'app/models/ability.rb')
-rw-r--r--app/models/ability.rb50
1 files changed, 26 insertions, 24 deletions
diff --git a/app/models/ability.rb b/app/models/ability.rb
index c60aa2d622e..e43316bead6 100644
--- a/app/models/ability.rb
+++ b/app/models/ability.rb
@@ -67,40 +67,42 @@ class Ability
def project_abilities(user, project)
rules = []
+ key = "/user/#{user.id}/project/#{project.id}"
+ RequestStore.store[key] ||= begin
+ team = project.team
- team = project.team
+ # Rules based on role in project
+ if team.master?(user)
+ rules += project_master_rules
- # Rules based on role in project
- if team.master?(user)
- rules += project_master_rules
+ elsif team.developer?(user)
+ rules += project_dev_rules
- elsif team.developer?(user)
- rules += project_dev_rules
+ elsif team.reporter?(user)
+ rules += project_report_rules
- elsif team.reporter?(user)
- rules += project_report_rules
+ elsif team.guest?(user)
+ rules += project_guest_rules
+ end
- elsif team.guest?(user)
- rules += project_guest_rules
- end
+ if project.public? || project.internal?
+ rules += public_project_rules
+ end
- if project.public? || project.internal?
- rules += public_project_rules
- end
+ if project.owner == user || user.admin?
+ rules += project_admin_rules
+ end
- if project.owner == user || user.admin?
- rules += project_admin_rules
- end
+ if project.group && project.group.has_owner?(user)
+ rules += project_admin_rules
+ end
- if project.group && project.group.has_owner?(user)
- rules += project_admin_rules
- end
+ if project.archived?
+ rules -= project_archived_rules
+ end
- if project.archived?
- rules -= project_archived_rules
+ rules
end
-
- rules
end
def public_project_rules