diff --git a/lib/main/tests/base.py b/lib/main/tests/base.py index 5036d30701..2039557191 100644 --- a/lib/main/tests/base.py +++ b/lib/main/tests/base.py @@ -63,9 +63,14 @@ class BaseTestMixin(object): def make_projects(self, created_by, count=1, playbook_content=''): results = [] + + if not os.path.exists(settings.PROJECTS_ROOT): + os.makedirs(settings.PROJECTS_ROOT) + for x in range(0, count): self.object_ctr = self.object_ctr + 1 # Create temp project directory. + project_dir = tempfile.mkdtemp(dir=settings.PROJECTS_ROOT) self._temp_project_dirs.append(project_dir) # Create temp playbook in project (if playbook content is given). diff --git a/lib/main/tests/projects.py b/lib/main/tests/projects.py index 4503720362..5d876e42e2 100644 --- a/lib/main/tests/projects.py +++ b/lib/main/tests/projects.py @@ -212,6 +212,24 @@ class ProjectsTest(BaseTest): deleted = self.post(org_teams, data2, expect=204, auth=self.get_normal_credentials()) got = self.get(url, expect=404, auth=self.get_normal_credentials()) + + # ===================================================================== + # TEAM PROJECTS + + team = Team.objects.filter(organization__pk = 2)[0] + team_projects = '/api/v1/teams/%s/projects/' % (team.pk) + + p1 = self.projects[0] + team.projects.add(p1) + team.save() + + got = self.get(team_projects, expect=200, auth=self.get_super_credentials()) + + # FIXME: project postablility tests somewhat incomplete. + # add tests to show we can create new projects on the subresource and so on. + + self.assertEquals(got['count'], 1) + # ===================================================================== # TEAMS USER MEMBERSHIP diff --git a/lib/main/views.py b/lib/main/views.py index d86cfed079..8a1dbea609 100644 --- a/lib/main/views.py +++ b/lib/main/views.py @@ -229,6 +229,31 @@ class TeamsUsersList(BaseSubList): return base raise PermissionDenied() + +class TeamsProjectsList(BaseSubList): + + model = Project + serializer_class = ProjectSerializer + permission_classes = (CustomRbac,) + parent_model = Team + relationship = 'projects' + postable = True + inject_primary_key_on_post_as = 'team' + severable = True + + # FIXME: filter_fields is no longer used, think we can remove these references everywhere given new custom filtering -- MPD + filter_fields = ('name',) + + def _get_queryset(self): + team = Team.objects.get(pk=self.kwargs['pk']) + base = team.projects.all() + if self.request.user.is_superuser or self.request.user in team.organization.admins.all(): + return base + if self.request.user in team.users.all(): + return base + raise PermissionDenied() + + class TeamsCredentialsList(BaseSubList): model = Credential diff --git a/lib/urls.py b/lib/urls.py index 174b8a62a2..9b595d6439 100644 --- a/lib/urls.py +++ b/lib/urls.py @@ -54,6 +54,7 @@ views_TeamsDetail = views.TeamsDetail.as_view() views_TeamsUsersList = views.TeamsUsersList.as_view() views_TeamsCredentialsList = views.TeamsCredentialsList.as_view() views_TeamsCredentialsList = views.TeamsCredentialsList.as_view() +views_TeamsProjectsList = views.TeamsProjectsList.as_view() # inventory service views_InventoryList = views.InventoryList.as_view() @@ -138,6 +139,7 @@ urlpatterns = patterns('', # api/v1/teams/ url(r'^api/v1/teams/$', views_TeamsList), url(r'^api/v1/teams/(?P[0-9]+)/$', views_TeamsDetail), + url(r'^api/v1/teams/(?P[0-9]+)/projects/$', views_TeamsProjectsList), url(r'^api/v1/teams/(?P[0-9]+)/users/$', views_TeamsUsersList), url(r'^api/v1/teams/(?P[0-9]+)/credentials/$', views_TeamsCredentialsList),