diff options
author | skv-headless <skv-headless@yandex.ru> | 2014-06-14 14:05:25 +0400 |
---|---|---|
committer | skv-headless <skv-headless@yandex.ru> | 2014-06-14 14:05:25 +0400 |
commit | 8ec02ed9aa36160bd19155cef1f71ca7e12ad4f3 (patch) | |
tree | 626d134665a25f218e9e36d0b3753b8d5b9ce9ed | |
parent | a5cbb4cb82a6911b5c1de117ae6ed4cbf667a679 (diff) | |
download | gitlab-ce-8ec02ed9aa36160bd19155cef1f71ca7e12ad4f3.tar.gz |
per request project rules caching
-rw-r--r-- | Gemfile | 1 | ||||
-rw-r--r-- | Gemfile.lock | 2 | ||||
-rw-r--r-- | app/models/ability.rb | 50 |
3 files changed, 29 insertions, 24 deletions
@@ -174,6 +174,7 @@ gem "font-awesome-rails", '~> 3.2' gem "gitlab_emoji", "~> 0.0.1.1" gem "gon", '~> 5.0.0' gem 'nprogress-rails' +gem 'request_store' group :development do gem "annotate", "~> 2.6.0.beta2" diff --git a/Gemfile.lock b/Gemfile.lock index 3bea962f6ac..f46cd723f80 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -412,6 +412,7 @@ GEM redis-store (1.1.4) redis (>= 2.2) ref (1.0.5) + request_store (1.0.5) require_all (1.3.2) rest-client (1.6.7) mime-types (>= 1.16) @@ -650,6 +651,7 @@ DEPENDENCIES rb-inotify redcarpet (~> 2.2.2) redis-rails + request_store rspec-rails sanitize (~> 2.0) sass-rails (~> 4.0.2) 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 |