mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Merge branch 'develop' into feature
This commit is contained in:
@@ -20,7 +20,8 @@ FILTER_NUMERIC_BASED_LOOKUP_MAP = dict(
|
||||
lte='lte',
|
||||
lt='lt',
|
||||
gte='gte',
|
||||
gt='gt'
|
||||
gt='gt',
|
||||
empty='isnull',
|
||||
)
|
||||
|
||||
FILTER_NEGATION_LOOKUP_MAP = dict(
|
||||
@@ -45,6 +46,10 @@ HTTP_REQUEST_META_SAFE_COPY = [
|
||||
'HTTP_REFERER',
|
||||
'HTTP_USER_AGENT',
|
||||
'HTTP_X_FORWARDED_FOR',
|
||||
'HTTP_X_FORWARDED_HOST',
|
||||
'HTTP_X_FORWARDED_PORT',
|
||||
'HTTP_X_FORWARDED_PROTO',
|
||||
'HTTP_X_REAL_IP',
|
||||
'QUERY_STRING',
|
||||
'REMOTE_ADDR',
|
||||
'REMOTE_HOST',
|
||||
|
@@ -105,6 +105,10 @@ class RestrictedGenericForeignKey(GenericForeignKey):
|
||||
# We avoid looking for values if either ct_id or fkey value is None
|
||||
ct_id = getattr(instance, ct_attname)
|
||||
if ct_id is not None:
|
||||
# Check if the content type actually exists
|
||||
if not self.get_content_type(id=ct_id, using=instance._state.db).model_class():
|
||||
continue
|
||||
|
||||
fk_val = getattr(instance, self.fk_field)
|
||||
if fk_val is not None:
|
||||
fk_dict[ct_id].add(fk_val)
|
||||
@@ -129,13 +133,14 @@ class RestrictedGenericForeignKey(GenericForeignKey):
|
||||
if ct_id is None:
|
||||
return None
|
||||
else:
|
||||
model = self.get_content_type(
|
||||
if model := self.get_content_type(
|
||||
id=ct_id, using=obj._state.db
|
||||
).model_class()
|
||||
return (
|
||||
model._meta.pk.get_prep_value(getattr(obj, self.fk_field)),
|
||||
model,
|
||||
)
|
||||
).model_class():
|
||||
return (
|
||||
model._meta.pk.get_prep_value(getattr(obj, self.fk_field)),
|
||||
model,
|
||||
)
|
||||
return None
|
||||
|
||||
return (
|
||||
ret_val,
|
||||
|
@@ -1,3 +1,4 @@
|
||||
{% load l10n %}
|
||||
<div class="progress">
|
||||
<div
|
||||
role="progressbar"
|
||||
@@ -5,7 +6,7 @@
|
||||
aria-valuemax="100"
|
||||
aria-valuenow="{{ utilization }}"
|
||||
class="progress-bar {{ bar_class }}"
|
||||
style="width: {{ utilization }}%;"
|
||||
style="width: {{ utilization|unlocalize }}%;"
|
||||
>
|
||||
{% if utilization >= 35 %}{{ utilization|floatformat:1 }}%{% endif %}
|
||||
</div>
|
||||
|
@@ -86,6 +86,10 @@ class DummyModel(models.Model):
|
||||
charfield = models.CharField(
|
||||
max_length=10
|
||||
)
|
||||
numberfield = models.IntegerField(
|
||||
blank=True,
|
||||
null=True
|
||||
)
|
||||
choicefield = models.IntegerField(
|
||||
choices=(('A', 1), ('B', 2), ('C', 3))
|
||||
)
|
||||
@@ -108,6 +112,7 @@ class BaseFilterSetTest(TestCase):
|
||||
"""
|
||||
class DummyFilterSet(BaseFilterSet):
|
||||
charfield = django_filters.CharFilter()
|
||||
numberfield = django_filters.NumberFilter()
|
||||
macaddressfield = MACAddressFilter()
|
||||
modelchoicefield = django_filters.ModelChoiceFilter(
|
||||
field_name='integerfield', # We're pretending this is a ForeignKey field
|
||||
@@ -132,6 +137,7 @@ class BaseFilterSetTest(TestCase):
|
||||
model = DummyModel
|
||||
fields = (
|
||||
'charfield',
|
||||
'numberfield',
|
||||
'choicefield',
|
||||
'datefield',
|
||||
'datetimefield',
|
||||
@@ -171,6 +177,25 @@ class BaseFilterSetTest(TestCase):
|
||||
self.assertEqual(self.filters['charfield__iew'].exclude, False)
|
||||
self.assertEqual(self.filters['charfield__niew'].lookup_expr, 'iendswith')
|
||||
self.assertEqual(self.filters['charfield__niew'].exclude, True)
|
||||
self.assertEqual(self.filters['charfield__empty'].lookup_expr, 'empty')
|
||||
self.assertEqual(self.filters['charfield__empty'].exclude, False)
|
||||
|
||||
def test_number_filter(self):
|
||||
self.assertIsInstance(self.filters['numberfield'], django_filters.NumberFilter)
|
||||
self.assertEqual(self.filters['numberfield'].lookup_expr, 'exact')
|
||||
self.assertEqual(self.filters['numberfield'].exclude, False)
|
||||
self.assertEqual(self.filters['numberfield__n'].lookup_expr, 'exact')
|
||||
self.assertEqual(self.filters['numberfield__n'].exclude, True)
|
||||
self.assertEqual(self.filters['numberfield__lt'].lookup_expr, 'lt')
|
||||
self.assertEqual(self.filters['numberfield__lt'].exclude, False)
|
||||
self.assertEqual(self.filters['numberfield__lte'].lookup_expr, 'lte')
|
||||
self.assertEqual(self.filters['numberfield__lte'].exclude, False)
|
||||
self.assertEqual(self.filters['numberfield__gt'].lookup_expr, 'gt')
|
||||
self.assertEqual(self.filters['numberfield__gt'].exclude, False)
|
||||
self.assertEqual(self.filters['numberfield__gte'].lookup_expr, 'gte')
|
||||
self.assertEqual(self.filters['numberfield__gte'].exclude, False)
|
||||
self.assertEqual(self.filters['numberfield__empty'].lookup_expr, 'isnull')
|
||||
self.assertEqual(self.filters['numberfield__empty'].exclude, False)
|
||||
|
||||
def test_mac_address_filter(self):
|
||||
self.assertIsInstance(self.filters['macaddressfield'], MACAddressFilter)
|
||||
|
Reference in New Issue
Block a user