diff --git a/lib/main/models/__init__.py b/lib/main/models/__init__.py index ef602d4b01..461ac0b2eb 100644 --- a/lib/main/models/__init__.py +++ b/lib/main/models/__init__.py @@ -507,6 +507,10 @@ class Team(CommonModel): users = models.ManyToManyField('auth.User', blank=True, related_name='teams') organizations = models.ManyToManyField('Organization', related_name='teams') + def get_absolute_url(self): + import lib.urls + return reverse(lib.urls.views_TeamsDetail, args=(self.pk,)) + class Project(CommonModel): ''' A project represents a playbook git repo that can access a set of inventories diff --git a/lib/main/views.py b/lib/main/views.py index be899409ae..275e25b1cc 100644 --- a/lib/main/views.py +++ b/lib/main/views.py @@ -146,6 +146,34 @@ class OrganizationsTagsList(BaseSubList): raise PermissionDenied() return Tag.objects.filter(organization_by_tag__in = [ organization ]) +class TeamsList(BaseList): + + model = Team + serializer_class = TeamSerializer + permission_classes = (CustomRbac,) + + # I can see a team if: + # I am a superuser + # I am an admin of the organization that the team is + # I am on that team + + def _get_queryset(self): + ''' I can see organizations when I am a superuser, or I am an admin or user in that organization ''' + base = Team.objects + if self.request.user.is_superuser: + return base.all() + return base.filter( + admins__in = [ self.request.user ] + ).distinct() | base.filter( + users__in = [ self.request.user ] + ).distinct() + +class TeamsDetail(BaseDetail): + + model = Team + serializer_class = TeamSerializer + permission_classes = (CustomRbac,) + class ProjectsList(BaseList): model = Project diff --git a/lib/urls.py b/lib/urls.py index ce77ec4f4e..83dad2575f 100644 --- a/lib/urls.py +++ b/lib/urls.py @@ -44,6 +44,8 @@ views_ProjectsOrganizationsList = views.ProjectsOrganizationsList.as_view() # audit trail service # team service +views_TeamsList = views.TeamsList.as_view() +views_TeamsDetail = views.TeamsDetail.as_view() # inventory service views_InventoryList = views.InventoryList.as_view() @@ -106,6 +108,9 @@ urlpatterns = patterns('', # team service # api/v1/teams/ + url(r'^api/v1/teams/$', views_TeamsList), + url(r'^api/v1/teams/(?P[0-9]+)/$', views_TeamsDetail), + # api/v1/teams/N/ # api/v1/teams/N/users/