mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
CustomField.filter_logic to slug
This commit is contained in:
@ -31,3 +31,22 @@ class CustomFieldTypeChoices(ChoiceSet):
|
|||||||
TYPE_URL: 500,
|
TYPE_URL: 500,
|
||||||
TYPE_SELECT: 600,
|
TYPE_SELECT: 600,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class CustomFieldFilterLogicChoices(ChoiceSet):
|
||||||
|
|
||||||
|
FILTER_DISABLED = 'disabled'
|
||||||
|
FILTER_LOOSE = 'loose'
|
||||||
|
FILTER_EXACT = 'exact'
|
||||||
|
|
||||||
|
CHOICES = (
|
||||||
|
(FILTER_DISABLED, 'Disabled'),
|
||||||
|
(FILTER_LOOSE, 'Loose'),
|
||||||
|
(FILTER_EXACT, 'Exact'),
|
||||||
|
)
|
||||||
|
|
||||||
|
LEGACY_MAP = {
|
||||||
|
FILTER_DISABLED: 0,
|
||||||
|
FILTER_LOOSE: 1,
|
||||||
|
FILTER_EXACT: 2,
|
||||||
|
}
|
||||||
|
@ -19,16 +19,6 @@ CUSTOMFIELD_MODELS = [
|
|||||||
'virtualization.virtualmachine',
|
'virtualization.virtualmachine',
|
||||||
]
|
]
|
||||||
|
|
||||||
# Custom field filter logic choices
|
|
||||||
CF_FILTER_DISABLED = 0
|
|
||||||
CF_FILTER_LOOSE = 1
|
|
||||||
CF_FILTER_EXACT = 2
|
|
||||||
CF_FILTER_CHOICES = (
|
|
||||||
(CF_FILTER_DISABLED, 'Disabled'),
|
|
||||||
(CF_FILTER_LOOSE, 'Loose'),
|
|
||||||
(CF_FILTER_EXACT, 'Exact'),
|
|
||||||
)
|
|
||||||
|
|
||||||
# Custom links
|
# Custom links
|
||||||
CUSTOMLINK_MODELS = [
|
CUSTOMLINK_MODELS = [
|
||||||
'circuits.circuit',
|
'circuits.circuit',
|
||||||
|
@ -43,7 +43,8 @@ class CustomFieldFilter(django_filters.Filter):
|
|||||||
return queryset.none()
|
return queryset.none()
|
||||||
|
|
||||||
# Apply the assigned filter logic (exact or loose)
|
# Apply the assigned filter logic (exact or loose)
|
||||||
if self.cf_type == CustomFieldTypeChoices.TYPE_BOOLEAN or self.filter_logic == CF_FILTER_EXACT:
|
if (self.cf_type == CustomFieldTypeChoices.TYPE_BOOLEAN or
|
||||||
|
self.filter_logic == CustomFieldFilterLogicChoices.FILTER_EXACT):
|
||||||
queryset = queryset.filter(
|
queryset = queryset.filter(
|
||||||
custom_field_values__field__name=self.field_name,
|
custom_field_values__field__name=self.field_name,
|
||||||
custom_field_values__serialized_value=value
|
custom_field_values__serialized_value=value
|
||||||
@ -66,7 +67,11 @@ class CustomFieldFilterSet(django_filters.FilterSet):
|
|||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
obj_type = ContentType.objects.get_for_model(self._meta.model)
|
obj_type = ContentType.objects.get_for_model(self._meta.model)
|
||||||
custom_fields = CustomField.objects.filter(obj_type=obj_type).exclude(filter_logic=CF_FILTER_DISABLED)
|
custom_fields = CustomField.objects.filter(
|
||||||
|
obj_type=obj_type
|
||||||
|
).exclude(
|
||||||
|
filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED
|
||||||
|
)
|
||||||
for cf in custom_fields:
|
for cf in custom_fields:
|
||||||
self.filters['cf_{}'.format(cf.name)] = CustomFieldFilter(field_name=cf.name, custom_field=cf)
|
self.filters['cf_{}'.format(cf.name)] = CustomFieldFilter(field_name=cf.name, custom_field=cf)
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ def get_custom_fields_for_model(content_type, filterable_only=False, bulk_edit=F
|
|||||||
field_dict = OrderedDict()
|
field_dict = OrderedDict()
|
||||||
custom_fields = CustomField.objects.filter(obj_type=content_type)
|
custom_fields = CustomField.objects.filter(obj_type=content_type)
|
||||||
if filterable_only:
|
if filterable_only:
|
||||||
custom_fields = custom_fields.exclude(filter_logic=CF_FILTER_DISABLED)
|
custom_fields = custom_fields.exclude(filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED)
|
||||||
|
|
||||||
for cf in custom_fields:
|
for cf in custom_fields:
|
||||||
field_name = 'cf_{}'.format(str(cf.name))
|
field_name = 'cf_{}'.format(str(cf.name))
|
||||||
|
@ -2,21 +2,19 @@
|
|||||||
# Generated by Django 1.11.9 on 2018-02-21 19:48
|
# Generated by Django 1.11.9 on 2018-02-21 19:48
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
||||||
from extras.constants import CF_FILTER_DISABLED, CF_FILTER_EXACT, CF_FILTER_LOOSE
|
|
||||||
|
|
||||||
|
|
||||||
def is_filterable_to_filter_logic(apps, schema_editor):
|
def is_filterable_to_filter_logic(apps, schema_editor):
|
||||||
CustomField = apps.get_model('extras', 'CustomField')
|
CustomField = apps.get_model('extras', 'CustomField')
|
||||||
CustomField.objects.filter(is_filterable=False).update(filter_logic=CF_FILTER_DISABLED)
|
CustomField.objects.filter(is_filterable=False).update(filter_logic=0)
|
||||||
CustomField.objects.filter(is_filterable=True).update(filter_logic=CF_FILTER_LOOSE)
|
CustomField.objects.filter(is_filterable=True).update(filter_logic=1)
|
||||||
# Select fields match on primary key only
|
# Select fields match on primary key only
|
||||||
CustomField.objects.filter(is_filterable=True, type=600).update(filter_logic=CF_FILTER_EXACT)
|
CustomField.objects.filter(is_filterable=True, type=600).update(filter_logic=2)
|
||||||
|
|
||||||
|
|
||||||
def filter_logic_to_is_filterable(apps, schema_editor):
|
def filter_logic_to_is_filterable(apps, schema_editor):
|
||||||
CustomField = apps.get_model('extras', 'CustomField')
|
CustomField = apps.get_model('extras', 'CustomField')
|
||||||
CustomField.objects.filter(filter_logic=CF_FILTER_DISABLED).update(is_filterable=False)
|
CustomField.objects.filter(filter_logic=0).update(is_filterable=False)
|
||||||
CustomField.objects.exclude(filter_logic=CF_FILTER_DISABLED).update(is_filterable=True)
|
CustomField.objects.exclude(filter_logic=0).update(is_filterable=True)
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
@ -10,6 +10,12 @@ CUSTOMFIELD_TYPE_CHOICES = (
|
|||||||
(600, 'select')
|
(600, 'select')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
CUSTOMFIELD_FILTER_LOGIC_CHOICES = (
|
||||||
|
(0, 'disabled'),
|
||||||
|
(1, 'integer'),
|
||||||
|
(2, 'exact'),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def customfield_type_to_slug(apps, schema_editor):
|
def customfield_type_to_slug(apps, schema_editor):
|
||||||
CustomField = apps.get_model('extras', 'CustomField')
|
CustomField = apps.get_model('extras', 'CustomField')
|
||||||
@ -17,6 +23,12 @@ def customfield_type_to_slug(apps, schema_editor):
|
|||||||
CustomField.objects.filter(type=str(id)).update(type=slug)
|
CustomField.objects.filter(type=str(id)).update(type=slug)
|
||||||
|
|
||||||
|
|
||||||
|
def customfield_filter_logic_to_slug(apps, schema_editor):
|
||||||
|
CustomField = apps.get_model('extras', 'CustomField')
|
||||||
|
for id, slug in CUSTOMFIELD_FILTER_LOGIC_CHOICES:
|
||||||
|
CustomField.objects.filter(filter_logic=str(id)).update(filter_logic=slug)
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
atomic = False
|
atomic = False
|
||||||
|
|
||||||
@ -25,6 +37,8 @@ class Migration(migrations.Migration):
|
|||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
|
|
||||||
|
# CustomField.type
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='customfield',
|
model_name='customfield',
|
||||||
name='type',
|
name='type',
|
||||||
@ -33,4 +47,15 @@ class Migration(migrations.Migration):
|
|||||||
migrations.RunPython(
|
migrations.RunPython(
|
||||||
code=customfield_type_to_slug
|
code=customfield_type_to_slug
|
||||||
),
|
),
|
||||||
|
|
||||||
|
# CustomField.filter_logic
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='customfield',
|
||||||
|
name='filter_logic',
|
||||||
|
field=models.CharField(default='loose', max_length=50),
|
||||||
|
),
|
||||||
|
migrations.RunPython(
|
||||||
|
code=customfield_filter_logic_to_slug
|
||||||
|
),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
@ -207,9 +207,10 @@ class CustomField(models.Model):
|
|||||||
help_text='If true, this field is required when creating new objects '
|
help_text='If true, this field is required when creating new objects '
|
||||||
'or editing an existing object.'
|
'or editing an existing object.'
|
||||||
)
|
)
|
||||||
filter_logic = models.PositiveSmallIntegerField(
|
filter_logic = models.CharField(
|
||||||
choices=CF_FILTER_CHOICES,
|
max_length=50,
|
||||||
default=CF_FILTER_LOOSE,
|
choices=CustomFieldFilterLogicChoices,
|
||||||
|
default=CustomFieldFilterLogicChoices.FILTER_LOOSE,
|
||||||
help_text='Loose matches any instance of a given string; exact '
|
help_text='Loose matches any instance of a given string; exact '
|
||||||
'matches the entire field.'
|
'matches the entire field.'
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user