From 2798fd117a8dcdcd3e035ee60b2673b798334e0a Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 16 Mar 2016 11:45:45 +0100 Subject: [PATCH] Refactoring project restrictions: max memberships and max private/public projects --- app/coffee/modules/admin/memberships.coffee | 14 +- .../modules/admin/project-profile.coffee | 8 +- .../services/current-user.service.coffee | 51 ---- .../services/current-user.service.spec.coffee | 278 ------------------ app/modules/services/project.service.coffee | 1 + app/partials/admin/admin-project-profile.jade | 9 +- .../admin/admin-project-restrictions.jade | 15 +- 7 files changed, 15 insertions(+), 361 deletions(-) diff --git a/app/coffee/modules/admin/memberships.coffee b/app/coffee/modules/admin/memberships.coffee index d91f625c..f5a30619 100644 --- a/app/coffee/modules/admin/memberships.coffee +++ b/app/coffee/modules/admin/memberships.coffee @@ -48,12 +48,11 @@ class MembershipsController extends mixOf(taiga.Controller, taiga.PageMixin, tai "$tgAnalytics", "tgAppMetaService", "$translate", - "tgCurrentUserService", "$tgAuth" ] constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @analytics, - @appMetaService, @translate, @currentUserService, @tgAuth) -> + @appMetaService, @translate, @tgAuth) -> bindMethods(@) @scope.project = {} @@ -112,15 +111,8 @@ class MembershipsController extends mixOf(taiga.Controller, taiga.PageMixin, tai @rootscope.$broadcast("membersform:new") _checkUsersLimit: -> - @scope.canAddUsers = true - userData = @currentUserService.getUser().toJS() - - if @currentUserService.canAddMoreMembersInPrivateProjects(@scope.projectId).valid == false - @.maxMembers = userData.max_memberships_private_projects - @scope.canAddUsers = false - else if @currentUserService.canAddMoreMembersInPublicProjects(@scope.projectId).valid == false - @.maxMembers = userData.max_memberships_public_projects - @scope.canAddUsers = false + @scope.canAddUsers = @.project.get('total_memberships') > @.project.get('max_memberships') + @.maxMembers = @.project.get('max_memberships') limitUsersWarning: -> title = @translate.instant("ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING") diff --git a/app/coffee/modules/admin/project-profile.coffee b/app/coffee/modules/admin/project-profile.coffee index 144970de..2d385c6e 100644 --- a/app/coffee/modules/admin/project-profile.coffee +++ b/app/coffee/modules/admin/project-profile.coffee @@ -69,11 +69,6 @@ class ProjectProfileController extends mixOf(taiga.Controller, taiga.PageMixin) description = @scope.project.description @appMetaService.setAll(title, description) - @scope.canBePrivateProject = @.currentUserService.canBePrivateProject(@scope.project.id) - @scope.canBePublicProject = @.currentUserService.canBePublicProject(@scope.project.id) - - @scope.isPrivateProject = @scope.project.is_private - promise.then null, @.onInitialDataError.bind(@) @scope.$on "project:loaded", => @@ -534,8 +529,7 @@ module.directive('tgProjectLogoModel', ['$parse', ProjectLogoModelDirective]) AdminProjectRestrictionsDirective = () -> return { scope: { - "canBePrivateProject": "=", - "canBePublicProject": "=" + "project": "=" }, templateUrl: "admin/admin-project-restrictions.html" } diff --git a/app/modules/services/current-user.service.coffee b/app/modules/services/current-user.service.coffee index eaa86b00..57b0db0f 100644 --- a/app/modules/services/current-user.service.coffee +++ b/app/modules/services/current-user.service.coffee @@ -118,57 +118,6 @@ class CurrentUserService return @.projects - canAddMoreMembersInPrivateProjects: (projectId) -> - project = @.projects.get('all').find (project) -> project.get('id') == projectId - user = @.getUser() - - if user.get('max_memberships_private_projects') != null && project.get('members').size >= user.get('max_memberships_private_projects') - return {valid: false, reason: 'max_memberships_private_projects', type: 'private_project'} - - return {valid: true} - - canAddMoreMembersInPublicProjects: (projectId) -> - project = @.projects.get('all').find (project) -> project.get('id') == projectId - user = @.getUser() - - if user.get('max_memberships_public_projects') != null && project.get('members').size >= user.get('max_memberships_public_projects') - return {valid: false, reason: 'max_memberships_public_projects', type: 'public_project'} - - return {valid: true} - - - canBePrivateProject: (projectId) -> - project = @.projects.get('all').find (project) -> project.get('id') == projectId - - return {valid: true} if project.get('is_private') - - result = @.canCreatePrivateProjects() - - return result if !result.valid - - user = @.getUser() - - if user.get('max_memberships_private_projects') != null && project.get('members').size > user.get('max_memberships_private_projects') - return {valid: false, reason: 'max_memberships_private_projects', type: 'private_project'} - - return {valid: true} - - canBePublicProject: (projectId) -> - project = @.projects.get('all').find (project) -> project.get('id') == projectId - - return {valid: true} if !project.get('is_private') - - result = @.canCreatePublicProjects() - - return result if !result.valid - - user = @.getUser() - - if user.get('max_memberships_public_projects') != null && project.get('members').size > user.get('max_memberships_public_projects') - return {valid: false, reason: 'max_memberships_public_projects', type: 'public_project'} - - return {valid: true} - canCreatePrivateProjects: () -> user = @.getUser() diff --git a/app/modules/services/current-user.service.spec.coffee b/app/modules/services/current-user.service.spec.coffee index 8e04980a..36646f48 100644 --- a/app/modules/services/current-user.service.spec.coffee +++ b/app/modules/services/current-user.service.spec.coffee @@ -204,112 +204,6 @@ describe "tgCurrentUserService", -> done() - it "the user can't add more members in private projects", () -> - user = Immutable.fromJS({ - id: 1, - name: "fake1", - max_memberships_private_projects: 2 - }) - - projects = Immutable.fromJS({ - all: [ - {id: 1, name: "fake1"}, - {id: 2, name: "fake2", members: [1, 2, 3, 4, 5], is_private: true}, - {id: 3, name: "fake3"}, - {id: 4, name: "fake4"} - ] - }) - - currentUserService._user = user - currentUserService._projects = projects - - result = currentUserService.canAddMoreMembersInPrivateProjects(2) - - expect(result).to.be.eql({ - valid: false, - reason: 'max_memberships_private_projects', - type: 'private_project' - }) - - it "the user can add more members in private projects", () -> - user = Immutable.fromJS({ - id: 1, - name: "fake1", - max_memberships_private_projects: 7 - }) - - currentUserService._user = user - - projects = Immutable.fromJS({ - all: [ - {id: 1, name: "fake1"}, - {id: 2, name: "fake2", members: [1, 2, 3, 4, 5], is_private: true}, - {id: 3, name: "fake3"}, - {id: 4, name: "fake4"} - ] - }) - - currentUserService._projects = projects - - result = currentUserService.canAddMoreMembersInPrivateProjects(2) - - expect(result).to.be.eql({ - valid: true - }) - - it "the user can't add more members in public projects", () -> - user = Immutable.fromJS({ - id: 1, - name: "fake1", - max_memberships_public_projects: 2 - }) - - projects = Immutable.fromJS({ - all: [ - {id: 1, name: "fake1"}, - {id: 2, name: "fake2", members: [1, 2, 3, 4, 5], is_private: false}, - {id: 3, name: "fake3"}, - {id: 4, name: "fake4"} - ] - }) - - currentUserService._user = user - currentUserService._projects = projects - - result = currentUserService.canAddMoreMembersInPublicProjects(2) - - expect(result).to.be.eql({ - valid: false, - reason: 'max_memberships_public_projects', - type: 'public_project' - }) - - it "the user can add more members in public projects", () -> - user = Immutable.fromJS({ - id: 1, - name: "fake1", - max_memberships_public_projects: 7 - }) - - projects = Immutable.fromJS({ - all: [ - {id: 1, name: "fake1"}, - {id: 2, name: "fake2", members: [1, 2, 3, 4, 5], is_private: false}, - {id: 3, name: "fake3"}, - {id: 4, name: "fake4"} - ] - }) - - currentUserService._user = user - currentUserService._projects = projects - - result = currentUserService.canAddMoreMembersInPublicProjects(2) - - expect(result).to.be.eql({ - valid: true - }) - - it "the user can't create private projects if they reach the maximum number of private projects", () -> user = Immutable.fromJS({ id: 1, @@ -345,92 +239,6 @@ describe "tgCurrentUserService", -> valid: true }) - it "the user can't convert a private project to a public project if they reach the maximum number of members", () -> - user = Immutable.fromJS({ - id: 1, - name: "fake1", - max_private_projects: 10, - total_private_projects: 1, - max_memberships_public_projects: 2 - }) - - currentUserService._user = user - - projects = Immutable.fromJS({ - all: [ - {id: 1, name: "fake1"}, - {id: 2, name: "fake2", members: [1, 2, 3, 4, 5], is_private: true}, - {id: 3, name: "fake3"}, - {id: 4, name: "fake4"} - ] - }) - - currentUserService._projects = projects - - result = currentUserService.canBePublicProject(2) - - expect(result).to.be.eql({ - valid: false, - reason: 'max_memberships_public_projects', - type: 'public_project' - }) - - it "the user can convert private projects to a public project", () -> - user = Immutable.fromJS({ - id: 1, - name: "fake1", - max_private_projects: 10, - total_private_projects: 1, - max_memberships_public_projects: 20 - }) - - currentUserService._user = user - - projects = Immutable.fromJS({ - all: [ - {id: 1, name: "fake1"}, - {id: 2, name: "fake2", members: [1, 2, 3, 4, 5]}, - {id: 3, name: "fake3"}, - {id: 4, name: "fake4"} - ] - }) - - currentUserService._projects = projects - - result = currentUserService.canBePublicProject(2) - - expect(result).to.be.eql({ - valid: true - }) - - it "the user can convert public projects to a public project if it is already public", () -> - user = Immutable.fromJS({ - id: 1, - name: "fake1", - max_private_projects: 10, - total_private_projects: 100, - max_memberships_public_projects: 2 - }) - - currentUserService._user = user - - projects = Immutable.fromJS({ - all: [ - {id: 1, name: "fake1"}, - {id: 2, name: "fake2", members: [1, 2, 3, 4, 5], is_private: false}, - {id: 3, name: "fake3"}, - {id: 4, name: "fake4"} - ] - }) - - currentUserService._projects = projects - - result = currentUserService.canBePublicProject(2) - - expect(result).to.be.eql({ - valid: true - }) - it "the user can't create public projects if they reach the maximum number of private projects", () -> user = Immutable.fromJS({ id: 1, @@ -465,89 +273,3 @@ describe "tgCurrentUserService", -> expect(result).to.be.eql({ valid: true }) - - it "the user can't convert a public projects to a private project if they reach the maximum number of members", () -> - user = Immutable.fromJS({ - id: 1, - name: "fake1", - max_public_projects: 10, - total_public_projects: 1, - max_memberships_private_projects: 2 - }) - - currentUserService._user = user - - projects = Immutable.fromJS({ - all: [ - {id: 1, name: "fake1"}, - {id: 2, name: "fake2", members: [1, 2, 3, 4, 5]}, - {id: 3, name: "fake3"}, - {id: 4, name: "fake4"} - ] - }) - - currentUserService._projects = projects - - result = currentUserService.canBePrivateProject(2) - - expect(result).to.be.eql({ - valid: false, - reason: 'max_memberships_private_projects', - type: 'private_project' - }) - - it "the user can convert public projects to a private project", () -> - user = Immutable.fromJS({ - id: 1, - name: "fake1", - max_public_projects: 10, - total_public_projects: 1, - max_memberships_private_projects: 20 - }) - - currentUserService._user = user - - projects = Immutable.fromJS({ - all: [ - {id: 1, name: "fake1"}, - {id: 2, name: "fake2", members: [1, 2, 3, 4, 5]}, - {id: 3, name: "fake3"}, - {id: 4, name: "fake4"} - ] - }) - - currentUserService._projects = projects - - result = currentUserService.canBePrivateProject(2) - - expect(result).to.be.eql({ - valid: true - }) - - it "the user can convert private project to a private project if it is already private", () -> - user = Immutable.fromJS({ - id: 1, - name: "fake1", - max_public_projects: 10, - total_public_projects: 1, - max_memberships_private_projects: 20 - }) - - currentUserService._user = user - - projects = Immutable.fromJS({ - all: [ - {id: 1, name: "fake1"}, - {id: 2, name: "fake2", members: [1, 2, 3, 4, 5]}, - {id: 3, name: "fake3"}, - {id: 4, name: "fake4"} - ] - }) - - currentUserService._projects = projects - - result = currentUserService.canBePrivateProject(2) - - expect(result).to.be.eql({ - valid: true - }) diff --git a/app/modules/services/project.service.coffee b/app/modules/services/project.service.coffee index ca118352..c09a8749 100644 --- a/app/modules/services/project.service.coffee +++ b/app/modules/services/project.service.coffee @@ -74,5 +74,6 @@ class ProjectService pslug = @.project.get('slug') return @projectsService.getProjectBySlug(pslug).then (project) => @.setProject(project) + angular.module("taigaCommon").service("tgProjectService", ProjectService) diff --git a/app/partials/admin/admin-project-profile.jade b/app/partials/admin/admin-project-profile.jade index 229739af..b188bb57 100644 --- a/app/partials/admin/admin-project-profile.jade +++ b/app/partials/admin/admin-project-profile.jade @@ -102,16 +102,13 @@ div.wrapper( placeholder="{{ 'ADMIN.PROJECT_PROFILE.RECRUITING_PLACEHOLDER' | translate }}" ) - tg-admin-project-restrictions( - can-be-private-project="canBePrivateProject" - can-be-public-project="canBePublicProject" - ) + tg-admin-project-restrictions(project="project") fieldset .project-privacy-settings div.privacy-option input.privacy-project( - ng-disabled="!canBePublicProject.valid" + ng-disabled="project.is_private && !project.can_is_private_be_updated" type="radio" id="private-project" name="privacy-project" @@ -122,7 +119,7 @@ div.wrapper( div.privacy-option input.privacy-project( - ng-disabled="!canBePrivateProject.valid" + ng-disabled="!project.is_private && !project.can_is_private_be_updated" type="radio" id="public-project" name="privacy-project" diff --git a/app/partials/admin/admin-project-restrictions.jade b/app/partials/admin/admin-project-restrictions.jade index e0b80b45..c56b08a1 100644 --- a/app/partials/admin/admin-project-restrictions.jade +++ b/app/partials/admin/admin-project-restrictions.jade @@ -1,11 +1,10 @@ -fieldset(ng-if="!canBePrivateProject.valid") - p - span(ng-if="canBePrivateProject.reason == 'max_private_projects'") {{ 'ADMIN.PROJECT_PROFILE.MAX_PRIVATE_PROJECTS' | translate }} +fieldset(ng-if="!project.can_is_private_be_updated") + p(ng-if="!project.is_private") + span(ng-if="project.total_memberships < project.max_memberships") {{ 'ADMIN.PROJECT_PROFILE.MAX_PRIVATE_PROJECTS' | translate }} - span(ng-if="canBePrivateProject.reason == 'max_memberships_private_projects'") {{ 'ADMIN.PROJECT_PROFILE.MAX_PRIVATE_PROJECTS_MEMBERS' | translate }} + span(ng-if="project.total_memberships >= project.max_memberships") {{ 'ADMIN.PROJECT_PROFILE.MAX_PRIVATE_PROJECTS_MEMBERS' | translate }} -fieldset(ng-if="!canBePublicProject.valid") - p - span(ng-if="canBePublicProject.reason == 'max_public_projects'") {{ 'ADMIN.PROJECT_PROFILE.MAX_PUBLIC_PROJECTS' | translate }} + p(ng-if="project.is_private") + span(ng-if="project.total_memberships < project.max_memberships") {{ 'ADMIN.PROJECT_PROFILE.MAX_PUBLIC_PROJECTS' | translate }} - span(ng-if="canBePublicProject.reason == 'max_memberships_public_projects'") {{ 'ADMIN.PROJECT_PROFILE.MAX_PUBLIC_PROJECTS_MEMBERS' | translate }} + span(ng-if="project.total_memberships >= project.max_memberships") {{ 'ADMIN.PROJECT_PROFILE.MAX_PUBLIC_PROJECTS_MEMBERS' | translate }}