From 7d224d8cf3ce7923e7cdeaa350bc6a6b7bfa54c0 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Thu, 18 Apr 2013 20:52:54 -0400 Subject: [PATCH] Ability to list job templates. Related resources are not added. --- lib/main/models/__init__.py | 5 +++++ lib/main/serializers.py | 14 ++++++++++++++ lib/main/views.py | 27 +++++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/lib/main/models/__init__.py b/lib/main/models/__init__.py index c5a082f8d4..29c6932211 100644 --- a/lib/main/models/__init__.py +++ b/lib/main/models/__init__.py @@ -764,6 +764,11 @@ class JobTemplate(CommonModel): # --list # -- host + def get_absolute_url(self): + import lib.urls + return reverse(lib.urls.views_JobTemplateDetail, args=(self.pk,)) + + class Job(CommonModel): ''' A job applies a project (with playbook) to an inventory source with a given diff --git a/lib/main/serializers.py b/lib/main/serializers.py index e8c2b2f168..561e2c8364 100644 --- a/lib/main/serializers.py +++ b/lib/main/serializers.py @@ -211,5 +211,19 @@ class VariableDataSerializer(BaseSerializer): # FIXME: related resources, maybe just the audit trail return dict() +class JobTemplateSerializer(BaseSerializer): + # add the URL and related resources + url = serializers.CharField(source='get_absolute_url', read_only=True) + related = serializers.SerializerMethodField('get_related') + + class Meta: + model = JobTemplate + fields = ('url', 'id', 'related', 'name', 'description', 'job_type', 'credential', 'project', 'inventory', 'created_by', 'creation_date') + + def get_related(self, obj): + # FIXME: related resources, credential, project, inventory, etc + return dict() + + diff --git a/lib/main/views.py b/lib/main/views.py index 7eac0fd952..ce8b993b3b 100644 --- a/lib/main/views.py +++ b/lib/main/views.py @@ -736,10 +736,33 @@ class VariableDetail(BaseDetail): raise PermissionDenied() class JobTemplatesList(BaseList): - pass + + model = JobTemplate + serializer_class = JobTemplateSerializer + permission_classes = (CustomRbac,) + filter_fields = ('name',) + + def _get_queryset(self): + ''' + I can see job templates when I am a superuser, or I am an admin of the project's orgs, or if I'm in a team on the project. + This does not mean I would be able to launch a job from the template or edit the JobTemplate. + ''' + base = JobTemplate.objects + if self.request.user.is_superuser: + return base.all() + return base.filter( + project__organizations__admins__in = [ self.request.user ] + ).distinct() | base.filter( + project__teams__users__in = [ self.request.user ] + ).distinct() + class JobTemplateDetail(BaseDetail): - pass + + model = JobTemplate + serializer_class = JobTemplateSerializer + permission_classes = (CustomRbac,) + class JobTemplateStart(BaseDetail): pass