diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 6dc20e1215..51ac883ee8 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -1157,6 +1157,7 @@ class HostSerializer(BaseSerializerWithVariables): ad_hoc_commands = self.reverse('api:host_ad_hoc_commands_list', kwargs={'pk': obj.pk}), ad_hoc_command_events = self.reverse('api:host_ad_hoc_command_events_list', kwargs={'pk': obj.pk}), fact_versions = self.reverse('api:host_fact_versions_list', kwargs={'pk': obj.pk}), + facts_recent = self.reverse('api:host_facts_recent_list', kwargs={'pk': obj.pk}), )) if obj.inventory: res['inventory'] = self.reverse('api:inventory_detail', kwargs={'pk': obj.inventory.pk}) diff --git a/awx/api/urls.py b/awx/api/urls.py index 9e5e0f5895..64a2749d01 100644 --- a/awx/api/urls.py +++ b/awx/api/urls.py @@ -114,6 +114,7 @@ host_urls = patterns('awx.api.views', #url(r'^(?P[0-9]+)/single_fact/$', 'host_single_fact_view'), url(r'^(?P[0-9]+)/fact_versions/$', 'host_fact_versions_list'), url(r'^(?P[0-9]+)/fact_view/$', 'host_fact_compare_view'), + url(r'^(?P[0-9]+)/facts_recent/$', 'host_facts_recent_list'), ) group_urls = patterns('awx.api.views', diff --git a/awx/api/views.py b/awx/api/views.py index da49187df7..edb032874a 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -1835,6 +1835,15 @@ class HostFactCompareView(SystemTrackingEnforcementMixin, SubDetailAPIView): return Response(self.serializer_class(instance=fact_entry).data) +class HostFactsRecentList(SubListAPIView): + + model = FactRecent + parent_model = Host + relationship = 'facts_recent' + serializer_class = FactSerializer + new_in_320 = True + + class GroupList(ListCreateAPIView): model = Group diff --git a/awx/main/access.py b/awx/main/access.py index 20becf2cbe..151b00b20c 100644 --- a/awx/main/access.py +++ b/awx/main/access.py @@ -2264,7 +2264,12 @@ class RoleAccess(BaseAccess): return False +class FactRecentAccess(BaseAccess): + model = FactRecent + + def get_queryset(self): + return FactRecent.objects.distinct() register_access(User, UserAccess) @@ -2299,3 +2304,4 @@ register_access(WorkflowJobTemplateNode, WorkflowJobTemplateNodeAccess) register_access(WorkflowJobNode, WorkflowJobNodeAccess) register_access(WorkflowJobTemplate, WorkflowJobTemplateAccess) register_access(WorkflowJob, WorkflowJobAccess) +register_access(FactRecent, FactRecentAccess) diff --git a/awx/main/fields.py b/awx/main/fields.py index 287866b092..373133eb60 100644 --- a/awx/main/fields.py +++ b/awx/main/fields.py @@ -46,6 +46,7 @@ class JSONField(upstream_JSONField): return {} return super(JSONField, self).from_db_value(value, expression, connection, context) + class JSONBField(upstream_JSONField): def get_db_prep_value(self, value, connection, prepared=False): if connection.vendor == 'sqlite': diff --git a/awx/main/models/fact.py b/awx/main/models/fact.py index 6881267cd8..e07f37448a 100644 --- a/awx/main/models/fact.py +++ b/awx/main/models/fact.py @@ -4,12 +4,11 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -from jsonbfield.fields import JSONField - from awx.main.fields import JSONBField __all__ = ('Fact', 'FactRecent') + class FactRecent(models.Model): host = models.ForeignKey( 'Host', @@ -97,3 +96,4 @@ class Fact(models.Model): fact_obj = Fact.objects.create(host_id=host_id, module=module, timestamp=timestamp, facts=facts) fact_obj.save() return fact_obj +