Add Inventory.kind field

This commit is contained in:
Wayne Witzel III
2017-04-28 11:48:24 -04:00
parent a45d41b379
commit 8a599d9754
3 changed files with 30 additions and 12 deletions

View File

@@ -23,21 +23,22 @@ class HostManager(models.Manager):
return len(set(self.values_list('name', flat=True))) return len(set(self.values_list('name', flat=True)))
def get_queryset(self): def get_queryset(self):
"""When the Inventory this host belongs to has a `host_filter` set """When the parent instance of the host query set has a `kind` of dynamic and a `host_filter`
generate the QuerySet using that filter. Otherwise just return the default filter. set. Use the `host_filter` to generate the queryset for the hosts.
""" """
qs = super(HostManager, self).get_queryset() qs = super(HostManager, self).get_queryset()
if self.instance is not None: if self.instance is not None:
if hasattr(self.instance, 'host_filter') and self.instance.host_filter is not None: if hasattr(self.instance, 'kind') and self.instance.kind == 'dynamic':
q = DynamicFilter.query_from_string(self.instance.host_filter) if hasattr(self.instance, 'host_filter') and self.instance.host_filter is not None:
# If we are using host_filters, disable the core_filters, this allows q = DynamicFilter.query_from_string(self.instance.host_filter)
# us to access all of the available Host entries, not just the ones associated # If we are using host_filters, disable the core_filters, this allows
# with a specific FK/relation. # us to access all of the available Host entries, not just the ones associated
# # with a specific FK/relation.
# If we don't disable this, a filter of {'inventory': self.instance} gets automatically #
# injected by the related object mapper. # If we don't disable this, a filter of {'inventory': self.instance} gets automatically
self.core_filters = {} # injected by the related object mapper.
return qs.filter(q) self.core_filters = {}
return qs.filter(q)
return qs return qs

View File

@@ -41,6 +41,11 @@ class Migration(migrations.Migration):
name='host_filter', name='host_filter',
field=awx.main.fields.DynamicFilterField(default=None, help_text='Filter that will be applied to the hosts of this inventory.', null=True, blank=True), field=awx.main.fields.DynamicFilterField(default=None, help_text='Filter that will be applied to the hosts of this inventory.', null=True, blank=True),
), ),
migrations.AddField(
model_name='inventory',
name='kind',
field=models.CharField(default=b'standard', help_text='Kind of inventory being represented.', max_length=32, choices=[(b'standard', 'Hosts have a direct link to this inventory.'), (b'dynamic', 'Hosts for inventory generated using the host_filter property.')]),
),
# Facts # Facts
migrations.AlterField( migrations.AlterField(

View File

@@ -46,6 +46,11 @@ class Inventory(CommonModelNameNotUnique, ResourceMixin):
an inventory source contains lists and hosts. an inventory source contains lists and hosts.
''' '''
KIND_CHOICES = [
('standard', _('Hosts have a direct link to this inventory.')),
('dynamic', _('Hosts for inventory generated using the host_filter property.')),
]
class Meta: class Meta:
app_label = 'main' app_label = 'main'
verbose_name_plural = _('inventories') verbose_name_plural = _('inventories')
@@ -103,6 +108,13 @@ class Inventory(CommonModelNameNotUnique, ResourceMixin):
editable=False, editable=False,
help_text=_('Number of external inventory sources in this inventory with failures.'), help_text=_('Number of external inventory sources in this inventory with failures.'),
) )
kind = models.CharField(
max_length=32,
choices=KIND_CHOICES,
blank=False,
default='standard',
help_text=_('Kind of inventory being represented.'),
)
host_filter = DynamicFilterField( host_filter = DynamicFilterField(
blank=True, blank=True,
null=True, null=True,