diff --git a/awx/api/generics.py b/awx/api/generics.py index 89230de9b0..0787988498 100644 --- a/awx/api/generics.py +++ b/awx/api/generics.py @@ -28,7 +28,7 @@ from awx.main.utils import * # FIXME: machinery for auto-adding audit trail logs to all CREATE/EDITS -__all__ = ['APIView', 'GenericAPIView', 'ListAPIView', 'ListCreateAPIView', +__all__ = ['APIView', 'GenericAPIView', 'ListAPIView', 'SimpleListAPIView', 'ListCreateAPIView', 'SubListAPIView', 'SubListCreateAPIView', 'RetrieveAPIView', 'RetrieveUpdateAPIView', 'RetrieveUpdateDestroyAPIView'] @@ -172,6 +172,9 @@ class GenericAPIView(generics.GenericAPIView, APIView): ret['search_fields'] = self.search_fields return ret +class SimpleListAPIView(generics.ListAPIView, GenericAPIView): + pass + class ListAPIView(generics.ListAPIView, GenericAPIView): # Base class for a read-only list view. diff --git a/awx/api/serializers.py b/awx/api/serializers.py index f3b0bb077e..051496b91f 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -999,6 +999,34 @@ class JobEventSerializer(BaseSerializer): pass return d +class ActivityStreamSerializer(BaseSerializer): + + class Meta: + model = ActivityStream + fields = ('id', 'url', 'related', 'summary_fields', 'timestamp', 'operation', 'changes') + + def get_related(self, obj): + if obj is None: + return {} + # res = super(ActivityStreamSerializer, self).get_related(obj) + # res.update(dict( + # #audit_trail = reverse('api:organization_audit_trail_list', args=(obj.pk,)), + # projects = reverse('api:organization_projects_list', args=(obj.pk,)), + # inventories = reverse('api:organization_inventories_list', args=(obj.pk,)), + # users = reverse('api:organization_users_list', args=(obj.pk,)), + # admins = reverse('api:organization_admins_list', args=(obj.pk,)), + # #tags = reverse('api:organization_tags_list', args=(obj.pk,)), + # teams = reverse('api:organization_teams_list', args=(obj.pk,)), + # )) + # return res + + def get_summary_fields(self, obj): + if obj is None: + return {} + d = super(ActivityStreamSerializer, self).get_summary_fields(obj) + return d + + class AuthTokenSerializer(serializers.Serializer): username = serializers.CharField() diff --git a/awx/api/urls.py b/awx/api/urls.py index 47a470aaa2..71dc9531e0 100644 --- a/awx/api/urls.py +++ b/awx/api/urls.py @@ -141,10 +141,10 @@ job_event_urls = patterns('awx.api.views', url(r'^(?P[0-9]+)/hosts/$', 'job_event_hosts_list'), ) -# activity_stream_urls = patterns('awx.api.views', -# url(r'^$', 'activity_stream_list'), -# url(r'^(?P[0-9]+)/$', 'activity_stream_detail'), -# ) +activity_stream_urls = patterns('awx.api.views', + url(r'^$', 'activity_stream_list'), + url(r'^(?P[0-9]+)/$', 'activity_stream_detail'), +) v1_urls = patterns('awx.api.views', url(r'^$', 'api_v1_root_view'), @@ -167,7 +167,7 @@ v1_urls = patterns('awx.api.views', url(r'^jobs/', include(job_urls)), url(r'^job_host_summaries/', include(job_host_summary_urls)), url(r'^job_events/', include(job_event_urls)), - # url(r'^activity_stream/', include(activity_stream_urls)), + url(r'^activity_stream/', include(activity_stream_urls)), ) urlpatterns = patterns('awx.api.views', diff --git a/awx/api/views.py b/awx/api/views.py index 05a42d512b..75896907fe 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -88,6 +88,7 @@ class ApiV1RootView(APIView): data['hosts'] = reverse('api:host_list') data['job_templates'] = reverse('api:job_template_list') data['jobs'] = reverse('api:job_list') + data['activity_stream'] = reverse('api:activity_stream_list') return Response(data) class ApiV1ConfigView(APIView): @@ -1058,6 +1059,15 @@ class JobJobEventsList(BaseJobEventsList): headers=headers) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) +class ActivityStreamList(SimpleListAPIView): + + model = ActivityStream + serializer_class = ActivityStreamSerializer + +class ActivityStreamDetail(RetrieveAPIView): + + model = ActivityStream + serializer_class = ActivityStreamSerializer # Create view functions for all of the class-based views to simplify inclusion # in URL patterns and reverse URL lookups, converting CamelCase names to diff --git a/awx/main/models/activity_stream.py b/awx/main/models/activity_stream.py index 42b415baa4..b0ef9127b0 100644 --- a/awx/main/models/activity_stream.py +++ b/awx/main/models/activity_stream.py @@ -3,6 +3,7 @@ from django.db import models +from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _ class ActivityStream(models.Model): @@ -33,3 +34,6 @@ class ActivityStream(models.Model): object2_type = models.TextField(null=True, blank=True) object_relationship_type = models.TextField(blank=True) + + def get_absolute_url(self): + return reverse('api:activity_stream_detail', args=(self.pk,))