Refactoring project restrictions: max memberships and max private/public projects
parent
cc6c8ae094
commit
2798fd117a
|
@ -48,12 +48,11 @@ class MembershipsController extends mixOf(taiga.Controller, taiga.PageMixin, tai
|
||||||
"$tgAnalytics",
|
"$tgAnalytics",
|
||||||
"tgAppMetaService",
|
"tgAppMetaService",
|
||||||
"$translate",
|
"$translate",
|
||||||
"tgCurrentUserService",
|
|
||||||
"$tgAuth"
|
"$tgAuth"
|
||||||
]
|
]
|
||||||
|
|
||||||
constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @analytics,
|
constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @analytics,
|
||||||
@appMetaService, @translate, @currentUserService, @tgAuth) ->
|
@appMetaService, @translate, @tgAuth) ->
|
||||||
bindMethods(@)
|
bindMethods(@)
|
||||||
|
|
||||||
@scope.project = {}
|
@scope.project = {}
|
||||||
|
@ -112,15 +111,8 @@ class MembershipsController extends mixOf(taiga.Controller, taiga.PageMixin, tai
|
||||||
@rootscope.$broadcast("membersform:new")
|
@rootscope.$broadcast("membersform:new")
|
||||||
|
|
||||||
_checkUsersLimit: ->
|
_checkUsersLimit: ->
|
||||||
@scope.canAddUsers = true
|
@scope.canAddUsers = @.project.get('total_memberships') > @.project.get('max_memberships')
|
||||||
userData = @currentUserService.getUser().toJS()
|
@.maxMembers = @.project.get('max_memberships')
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
limitUsersWarning: ->
|
limitUsersWarning: ->
|
||||||
title = @translate.instant("ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING")
|
title = @translate.instant("ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING")
|
||||||
|
|
|
@ -69,11 +69,6 @@ class ProjectProfileController extends mixOf(taiga.Controller, taiga.PageMixin)
|
||||||
description = @scope.project.description
|
description = @scope.project.description
|
||||||
@appMetaService.setAll(title, 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(@)
|
promise.then null, @.onInitialDataError.bind(@)
|
||||||
|
|
||||||
@scope.$on "project:loaded", =>
|
@scope.$on "project:loaded", =>
|
||||||
|
@ -534,8 +529,7 @@ module.directive('tgProjectLogoModel', ['$parse', ProjectLogoModelDirective])
|
||||||
AdminProjectRestrictionsDirective = () ->
|
AdminProjectRestrictionsDirective = () ->
|
||||||
return {
|
return {
|
||||||
scope: {
|
scope: {
|
||||||
"canBePrivateProject": "=",
|
"project": "="
|
||||||
"canBePublicProject": "="
|
|
||||||
},
|
},
|
||||||
templateUrl: "admin/admin-project-restrictions.html"
|
templateUrl: "admin/admin-project-restrictions.html"
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,57 +118,6 @@ class CurrentUserService
|
||||||
|
|
||||||
return @.projects
|
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: () ->
|
canCreatePrivateProjects: () ->
|
||||||
user = @.getUser()
|
user = @.getUser()
|
||||||
|
|
||||||
|
|
|
@ -204,112 +204,6 @@ describe "tgCurrentUserService", ->
|
||||||
|
|
||||||
done()
|
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", () ->
|
it "the user can't create private projects if they reach the maximum number of private projects", () ->
|
||||||
user = Immutable.fromJS({
|
user = Immutable.fromJS({
|
||||||
id: 1,
|
id: 1,
|
||||||
|
@ -345,92 +239,6 @@ describe "tgCurrentUserService", ->
|
||||||
valid: true
|
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", () ->
|
it "the user can't create public projects if they reach the maximum number of private projects", () ->
|
||||||
user = Immutable.fromJS({
|
user = Immutable.fromJS({
|
||||||
id: 1,
|
id: 1,
|
||||||
|
@ -465,89 +273,3 @@ describe "tgCurrentUserService", ->
|
||||||
expect(result).to.be.eql({
|
expect(result).to.be.eql({
|
||||||
valid: true
|
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
|
|
||||||
})
|
|
||||||
|
|
|
@ -74,5 +74,6 @@ class ProjectService
|
||||||
pslug = @.project.get('slug')
|
pslug = @.project.get('slug')
|
||||||
|
|
||||||
return @projectsService.getProjectBySlug(pslug).then (project) => @.setProject(project)
|
return @projectsService.getProjectBySlug(pslug).then (project) => @.setProject(project)
|
||||||
|
|
||||||
|
|
||||||
angular.module("taigaCommon").service("tgProjectService", ProjectService)
|
angular.module("taigaCommon").service("tgProjectService", ProjectService)
|
||||||
|
|
|
@ -102,16 +102,13 @@ div.wrapper(
|
||||||
placeholder="{{ 'ADMIN.PROJECT_PROFILE.RECRUITING_PLACEHOLDER' | translate }}"
|
placeholder="{{ 'ADMIN.PROJECT_PROFILE.RECRUITING_PLACEHOLDER' | translate }}"
|
||||||
)
|
)
|
||||||
|
|
||||||
tg-admin-project-restrictions(
|
tg-admin-project-restrictions(project="project")
|
||||||
can-be-private-project="canBePrivateProject"
|
|
||||||
can-be-public-project="canBePublicProject"
|
|
||||||
)
|
|
||||||
|
|
||||||
fieldset
|
fieldset
|
||||||
.project-privacy-settings
|
.project-privacy-settings
|
||||||
div.privacy-option
|
div.privacy-option
|
||||||
input.privacy-project(
|
input.privacy-project(
|
||||||
ng-disabled="!canBePublicProject.valid"
|
ng-disabled="project.is_private && !project.can_is_private_be_updated"
|
||||||
type="radio"
|
type="radio"
|
||||||
id="private-project"
|
id="private-project"
|
||||||
name="privacy-project"
|
name="privacy-project"
|
||||||
|
@ -122,7 +119,7 @@ div.wrapper(
|
||||||
|
|
||||||
div.privacy-option
|
div.privacy-option
|
||||||
input.privacy-project(
|
input.privacy-project(
|
||||||
ng-disabled="!canBePrivateProject.valid"
|
ng-disabled="!project.is_private && !project.can_is_private_be_updated"
|
||||||
type="radio"
|
type="radio"
|
||||||
id="public-project"
|
id="public-project"
|
||||||
name="privacy-project"
|
name="privacy-project"
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
fieldset(ng-if="!canBePrivateProject.valid")
|
fieldset(ng-if="!project.can_is_private_be_updated")
|
||||||
p
|
p(ng-if="!project.is_private")
|
||||||
span(ng-if="canBePrivateProject.reason == 'max_private_projects'") {{ 'ADMIN.PROJECT_PROFILE.MAX_PRIVATE_PROJECTS' | translate }}
|
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(ng-if="project.is_private")
|
||||||
p
|
span(ng-if="project.total_memberships < project.max_memberships") {{ 'ADMIN.PROJECT_PROFILE.MAX_PUBLIC_PROJECTS' | translate }}
|
||||||
span(ng-if="canBePublicProject.reason == 'max_public_projects'") {{ '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 }}
|
||||||
|
|
Loading…
Reference in New Issue