From 3f30eecc7d623537e93227de36f194e73a1510fc Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 6 Nov 2013 15:00:46 -0500 Subject: [PATCH 1/3] Add granular permission levels to User Display buttons for job control only if the user has permission to do so. --- assets/scripts/app/models/user.coffee | 18 +++++++++++++ assets/scripts/app/views/repo/show.coffee | 30 ++++++++++++++------- assets/scripts/spec/unit/user_spec.coffee | 32 +++++++++++++++++++++++ 3 files changed, 70 insertions(+), 10 deletions(-) create mode 100644 assets/scripts/spec/unit/user_spec.coffee diff --git a/assets/scripts/app/models/user.coffee b/assets/scripts/app/models/user.coffee index c073abf2..6c665dd0 100644 --- a/assets/scripts/app/models/user.coffee +++ b/assets/scripts/app/models/user.coffee @@ -37,6 +37,24 @@ require 'travis/model' permissions ).property() + adminPermissions: (-> + permissions = Ember.ArrayProxy.create(content: []) + Travis.ajax.get('/users/permissions', (data) => permissions.set('content', data.admin)) + permissions + ).property() + + pullPermissions: (-> + permissions = Ember.ArrayProxy.create(content: []) + Travis.ajax.get('/users/permissions', (data) => permissions.set('content', data.pull)) + permissions + ).property() + + pushPermissions: (-> + permissions = Ember.ArrayProxy.create(content: []) + Travis.ajax.get('/users/permissions', (data) => permissions.set('content', data.push)) + permissions + ).property() + updateLocale: (locale) -> @save() Travis.setLocale(locale) diff --git a/assets/scripts/app/views/repo/show.coffee b/assets/scripts/app/views/repo/show.coffee index 4dcaafde..8610c343 100644 --- a/assets/scripts/app/views/repo/show.coffee +++ b/assets/scripts/app/views/repo/show.coffee @@ -107,14 +107,19 @@ Travis.reopen displayRegenerateKey: true canRegenerateKey: (-> - @get('displayRegenerateKey') && @get('hasPermission') - ).property('hasPermission') + @get('displayRegenerateKey') && @get('hasAdminPermission') + ).property('hasAdminPermission') hasPermission: (-> if permissions = @get('currentUser.permissions') permissions.contains parseInt(@get('repo.id')) ).property('currentUser.permissions.length', 'repo.id') + hasAdminPermission: (-> + if permissions = @get('currentUser.adminPermissions') + permissions.contains parseInt(@get('repo.id')) + ).property('currentUser.adminPermissions.length', 'repo.id') + statusImageUrl: (-> Travis.Urls.statusImage(@get('slug')) ).property('slug') @@ -174,21 +179,26 @@ Travis.reopen permissions.contains parseInt(@get('repo.id')) ).property('currentUser.permissions.length', 'repo.id') + hasPushPermission: (-> + if permissions = @get('currentUser.pushPermissions') + permissions.contains parseInt(@get('repo.id')) + ).property('currentUser.pushPermissions.length', 'repo.id') + displayRequeueBuild: (-> @get('isBuildTab') && @get('build.isFinished') ).property('isBuildTab', 'build.isFinished') canRequeueBuild: (-> - @get('displayRequeueBuild') && @get('hasPermission') - ).property('displayRequireBuild', 'hasPermission') + @get('displayRequeueBuild') && @get('hasPushPermission') + ).property('displayRequireBuild', 'hasPushPermission') displayRequeueJob: (-> @get('isJobTab') && @get('job.isFinished') ).property('isJobTab', 'job.isFinished') canRequeueJob: (-> - @get('displayRequeueJob') && @get('hasPermission') - ).property('displayRequeueJob', 'hasPermission') + @get('displayRequeueJob') && @get('hasPushPermission') + ).property('displayRequeueJob', 'hasPushPermission') showDownloadLog: (-> @get('jobIdForLog') @@ -205,16 +215,16 @@ Travis.reopen ).property('jobIdForLog') canCancelBuild: (-> - @get('displayCancelBuild') && @get('hasPermission') - ).property('displayCancelBuild', 'hasPermission') + @get('displayCancelBuild') && @get('hasPushPermission') + ).property('displayCancelBuild', 'hasPushPermission') displayCancelBuild: (-> @get('isBuildTab') && @get('build.canCancel') ).property('isBuildTab', 'build.canCancel') canCancelJob: (-> - @get('displayCancelJob') && @get('hasPermission') - ).property('displayCancelJob', 'hasPermission') + @get('displayCancelJob') && @get('hasPushPermission') + ).property('displayCancelJob', 'hasPushPermission') displayCancelJob: (-> @get('isJobTab') && @get('job.canCancel') diff --git a/assets/scripts/spec/unit/user_spec.coffee b/assets/scripts/spec/unit/user_spec.coffee new file mode 100644 index 00000000..9c4f832b --- /dev/null +++ b/assets/scripts/spec/unit/user_spec.coffee @@ -0,0 +1,32 @@ +record = null + +module "Travis.User", + setup: -> + teardown: -> + Travis.User.resetData() + +test '', -> + $.mockjax({ + url: '/users/permissions', + responseTime: 10, + responseText: { + permissions: [1], + admin: [1], + pull: [2], + push: [3] + } + }); + + Travis.User.load [{ id: '1', login: 'test@travis-ci.org' }] + user = null + pushPermissions = null + adminPermissions = null + + Ember.run -> + user = Travis.User.find(1) + pushPermissions = user.get('pushPermissions') + adminPermissions = user.get('adminPermissions') + + wait().then -> + deepEqual(adminPermissions.toArray(), [1]) + deepEqual(pushPermissions.toArray(), [3]) \ No newline at end of file From b72cc319cc5909c674b30e17bdaec49877253abe Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 6 Nov 2013 15:57:16 -0500 Subject: [PATCH 2/3] Reduce number of AJAX requests --- assets/scripts/app/models/user.coffee | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/assets/scripts/app/models/user.coffee b/assets/scripts/app/models/user.coffee index 6c665dd0..eaf4bc3f 100644 --- a/assets/scripts/app/models/user.coffee +++ b/assets/scripts/app/models/user.coffee @@ -31,27 +31,31 @@ require 'travis/model' "https://github.com/#{@get('login')}" ).property() + _rawPermissions: (-> + Travis.ajax.get('/users/permissoins') + ).property() + permissions: (-> permissions = Ember.ArrayProxy.create(content: []) - Travis.ajax.get('/users/permissions', (data) => permissions.set('content', data.permissions)) + @get('_rawPermissions').then (data) => permissions.set('content', data.permissions) permissions ).property() adminPermissions: (-> permissions = Ember.ArrayProxy.create(content: []) - Travis.ajax.get('/users/permissions', (data) => permissions.set('content', data.admin)) + @get('_rawPermissions').then (data) => permissions.set('content', data.admin) permissions ).property() pullPermissions: (-> permissions = Ember.ArrayProxy.create(content: []) - Travis.ajax.get('/users/permissions', (data) => permissions.set('content', data.pull)) + @get('_rawPermissions').then (data) => permissions.set('content', data.pull) permissions ).property() pushPermissions: (-> permissions = Ember.ArrayProxy.create(content: []) - Travis.ajax.get('/users/permissions', (data) => permissions.set('content', data.push)) + @get('_rawPermissions').then (data) => permissions.set('content', data.push) permissions ).property() From 758ad403497eb88231e68358d7896759e276458a Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Thu, 7 Nov 2013 11:50:12 -0500 Subject: [PATCH 3/3] Fix typo --- assets/scripts/app/models/user.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/scripts/app/models/user.coffee b/assets/scripts/app/models/user.coffee index eaf4bc3f..75122458 100644 --- a/assets/scripts/app/models/user.coffee +++ b/assets/scripts/app/models/user.coffee @@ -32,7 +32,7 @@ require 'travis/model' ).property() _rawPermissions: (-> - Travis.ajax.get('/users/permissoins') + Travis.ajax.get('/users/permissions') ).property() permissions: (->