diff --git a/data/model.py b/data/model.py index f536658ab..5d3b4d692 100644 --- a/data/model.py +++ b/data/model.py @@ -112,6 +112,10 @@ def create_team(name, org, team_role_name, description=''): description=description) +def remove_team(name, org): + # TODO: have code to remove the team, and all its repo permissions, etc. + pass + def add_user_to_team(user, team): return TeamMember.create(user=user, team=team) @@ -124,29 +128,16 @@ def remove_user_from_team(user, team): raise InvalidTeamException('User does not belong to team.') -def set_team_org_permission(team, org, team_role_name): - new_role = TeamRole.get(TeamRole.name == tean_role_name) +def get_team_org_role(team): + return TeamRole.get(TeamRole.id == team.role.id) + +def set_team_org_permission(team, team_role_name): + new_role = TeamRole.get(TeamRole.name == team_role_name) team.role = new_role team.save() return team -def set_team_org_permission(team, org, role_name): - new_role = Role.get(Role.name == role_name) - - # Fetch any existing permission for this user on the repo - try: - perm = TeamPermission.get(TeamPermission.team == team, - TeamPermission.organization == org) - perm.role = new_role - perm.save() - return perm - except TeamPermission.DoesNotExist: - new_perm = TeamPermission.create(team=team, organization=org, - role=new_role) - return new_perm - - def create_federated_user(username, email, service_name, service_id): new_user = create_user(username, None, email) new_user.verified = True diff --git a/endpoints/api.py b/endpoints/api.py index 6c9e6c43f..8ed6251a3 100644 --- a/endpoints/api.py +++ b/endpoints/api.py @@ -215,10 +215,10 @@ def get_matching_entities(prefix): users = model.get_matching_users(prefix, organization) def team_view(team): - return { + result = { 'name': team.name, 'kind': 'team', - 'is_org_member': True, + 'is_org_member': True } def user_view(user): @@ -242,11 +242,13 @@ user_files = UserRequestFiles(app.config['AWS_ACCESS_KEY'], def team_view(orgname, t): view_permission = ViewTeamPermission(orgname, t.name) + role = model.get_team_org_role(t).name return { 'id': t.id, 'name': t.name, 'description': t.description, - 'can_view': view_permission.can() + 'can_view': view_permission.can(), + 'role': role } @app.route('/api/organization/', methods=['GET']) @@ -255,11 +257,12 @@ def get_organization(orgname): def org_view(o, teams): admin_org = AdministerOrganizationPermission(orgname) + is_admin = admin_org.can() return { 'name': o.username, 'gravatar': compute_hash(o.email), 'teams': {t.name : team_view(orgname, t) for t in teams}, - 'is_admin': admin_org.can() + 'is_admin': is_admin } if current_user.is_anonymous(): @@ -313,13 +316,25 @@ def update_organization_team(orgname, teamname): if edit_permission.can(): team = None + json = request.get_json() + is_existing = False try: team = model.get_organization_team(orgname, teamname) + is_existing = True except: - abort(404) + # Create the new team. + description = json['description'] if 'description' in json else '' + role = json['role'] if 'role' in json else 'member' + + team = model.create_team(teamname, orgname, role, description) + + if is_existing: + if 'description' in json: + team.description = json['description'] + team.save() + if 'role' in json: + team = model.set_team_org_permission(team, json['role']) - team.description = request.get_json()['description'] - team.save() return jsonify(team_view(orgname, team)) abort(403) diff --git a/static/css/quay.css b/static/css/quay.css index 6ef3d3b18..5fed775e0 100644 --- a/static/css/quay.css +++ b/static/css/quay.css @@ -1391,8 +1391,25 @@ p.editable:hover i { } .org-view .team-listing { - margin: 10px; - padding: 10px; + padding: 4px; +} + +.org-view .header-col { + color: #444; + padding-left: 30px; +} + +.org-view .header-col dd { + margin-bottom: 20px; +} + +.org-view .header-col .info-icon { + float: none; + margin-left: 10px; +} + +.org-view .team-listing .btn-group { + margin-top: 20px; } .org-view .team-listing i { diff --git a/static/js/controllers.js b/static/js/controllers.js index dcdcb2c24..eb51f18f1 100644 --- a/static/js/controllers.js +++ b/static/js/controllers.js @@ -1076,7 +1076,14 @@ function NewRepoCtrl($scope, $location, $http, $timeout, UserService, Restangula }); } -function OrgViewCtrl($scope, Restangular, $routeParams) { +function OrgViewCtrl($rootScope, $scope, Restangular, $routeParams) { + $('.info-icon').popover({ + 'trigger': 'hover', + 'html': true + }); + + $rootScope.title = 'Loading...'; + var orgname = $routeParams.orgname; var loadOrganization = function() { @@ -1084,11 +1091,24 @@ function OrgViewCtrl($scope, Restangular, $routeParams) { getOrganization.get().then(function(resp) { $scope.organization = resp; $scope.loading = false; + + $rootScope.title = orgname; }, function() { $scope.loading = false; }); }; + $scope.setRole = function(teamname, role) { + $scope.organization.teams[teamname].role = role; + + var updateTeam = Restangular.one(getRestUrl('organization', orgname, 'team', teamname)); + var data = $scope.organization.teams[teamname]; + updateTeam.customPUT(data).then(function(resp) { + }, function() { + $('#cannotChangeTeamModal').modal({}); + }); + }; + loadOrganization(); } diff --git a/static/partials/org-view.html b/static/partials/org-view.html index dc0a56573..4221210da 100644 --- a/static/partials/org-view.html +++ b/static/partials/org-view.html @@ -9,16 +9,54 @@
-
-
- - - {{ team.name }} - - - {{ team.name }} - +
+
+
+ Team Permissions + +
+
+ +
+
+
+
+ + + {{ team.name }} + + + {{ team.name }} + +
+ +
+
+ +
+ + + +
-
+ + + diff --git a/static/partials/repo-admin.html b/static/partials/repo-admin.html index 9a7e7d227..a3d6d052d 100644 --- a/static/partials/repo-admin.html +++ b/static/partials/repo-admin.html @@ -66,7 +66,7 @@
- +