mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Move dict_to_querydict() and normalize_querydict() to utilities.querydict
This commit is contained in:
@ -16,8 +16,9 @@ from core.models import ObjectType
|
|||||||
from extras.choices import BookmarkOrderingChoices
|
from extras.choices import BookmarkOrderingChoices
|
||||||
from netbox.choices import ButtonColorChoices
|
from netbox.choices import ButtonColorChoices
|
||||||
from utilities.permissions import get_permission_for_model
|
from utilities.permissions import get_permission_for_model
|
||||||
|
from utilities.querydict import dict_to_querydict
|
||||||
from utilities.templatetags.builtins.filters import render_markdown
|
from utilities.templatetags.builtins.filters import render_markdown
|
||||||
from utilities.utils import content_type_identifier, content_type_name, dict_to_querydict
|
from utilities.utils import content_type_identifier, content_type_name
|
||||||
from utilities.views import get_viewname
|
from utilities.views import get_viewname
|
||||||
from .utils import register_widget
|
from .utils import register_widget
|
||||||
|
|
||||||
|
@ -23,9 +23,9 @@ from netbox.models.features import (
|
|||||||
CloningMixin, CustomFieldsMixin, CustomLinksMixin, ExportTemplatesMixin, SyncedDataMixin, TagsMixin,
|
CloningMixin, CustomFieldsMixin, CustomLinksMixin, ExportTemplatesMixin, SyncedDataMixin, TagsMixin,
|
||||||
)
|
)
|
||||||
from utilities.html import clean_html
|
from utilities.html import clean_html
|
||||||
|
from utilities.querydict import dict_to_querydict
|
||||||
from utilities.querysets import RestrictedQuerySet
|
from utilities.querysets import RestrictedQuerySet
|
||||||
from utilities.jinja2 import render_jinja2
|
from utilities.jinja2 import render_jinja2
|
||||||
from utilities.utils import dict_to_querydict
|
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'Bookmark',
|
'Bookmark',
|
||||||
|
@ -21,10 +21,11 @@ from netbox.views.generic.mixins import TableMixin
|
|||||||
from utilities.data import shallow_compare_dict
|
from utilities.data import shallow_compare_dict
|
||||||
from utilities.forms import ConfirmationForm, get_field_value
|
from utilities.forms import ConfirmationForm, get_field_value
|
||||||
from utilities.paginator import EnhancedPaginator, get_paginate_count
|
from utilities.paginator import EnhancedPaginator, get_paginate_count
|
||||||
|
from utilities.querydict import normalize_querydict
|
||||||
from utilities.request import copy_safe_request
|
from utilities.request import copy_safe_request
|
||||||
from utilities.rqworker import get_workers_for_queue
|
from utilities.rqworker import get_workers_for_queue
|
||||||
from utilities.templatetags.builtins.filters import render_markdown
|
from utilities.templatetags.builtins.filters import render_markdown
|
||||||
from utilities.utils import count_related, normalize_querydict
|
from utilities.utils import count_related
|
||||||
from utilities.views import ContentTypePermissionRequiredMixin, get_viewname, register_model_view
|
from utilities.views import ContentTypePermissionRequiredMixin, get_viewname, register_model_view
|
||||||
from . import filtersets, forms, tables
|
from . import filtersets, forms, tables
|
||||||
from .models import *
|
from .models import *
|
||||||
|
@ -18,7 +18,8 @@ from utilities.error_handlers import handle_protectederror
|
|||||||
from utilities.exceptions import AbortRequest, PermissionsViolation
|
from utilities.exceptions import AbortRequest, PermissionsViolation
|
||||||
from utilities.forms import ConfirmationForm, restrict_form_fields
|
from utilities.forms import ConfirmationForm, restrict_form_fields
|
||||||
from utilities.permissions import get_permission_for_model
|
from utilities.permissions import get_permission_for_model
|
||||||
from utilities.utils import normalize_querydict, prepare_cloned_fields
|
from utilities.querydict import normalize_querydict
|
||||||
|
from utilities.utils import prepare_cloned_fields
|
||||||
from utilities.views import GetReturnURLMixin, get_viewname
|
from utilities.views import GetReturnURLMixin, get_viewname
|
||||||
from .base import BaseObjectView
|
from .base import BaseObjectView
|
||||||
from .mixins import ActionsMixin, TableMixin
|
from .mixins import ActionsMixin, TableMixin
|
||||||
|
38
netbox/utilities/querydict.py
Normal file
38
netbox/utilities/querydict.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
from django.http import QueryDict
|
||||||
|
from django.utils.datastructures import MultiValueDict
|
||||||
|
|
||||||
|
__all__ = (
|
||||||
|
'dict_to_querydict',
|
||||||
|
'normalize_querydict',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def dict_to_querydict(d, mutable=True):
|
||||||
|
"""
|
||||||
|
Create a QueryDict instance from a regular Python dictionary.
|
||||||
|
"""
|
||||||
|
qd = QueryDict(mutable=True)
|
||||||
|
for k, v in d.items():
|
||||||
|
item = MultiValueDict({k: v}) if isinstance(v, (list, tuple, set)) else {k: v}
|
||||||
|
qd.update(item)
|
||||||
|
if not mutable:
|
||||||
|
qd._mutable = False
|
||||||
|
return qd
|
||||||
|
|
||||||
|
|
||||||
|
def normalize_querydict(querydict):
|
||||||
|
"""
|
||||||
|
Convert a QueryDict to a normal, mutable dictionary, preserving list values. For example,
|
||||||
|
|
||||||
|
QueryDict('foo=1&bar=2&bar=3&baz=')
|
||||||
|
|
||||||
|
becomes:
|
||||||
|
|
||||||
|
{'foo': '1', 'bar': ['2', '3'], 'baz': ''}
|
||||||
|
|
||||||
|
This function is necessary because QueryDict does not provide any built-in mechanism which preserves multiple
|
||||||
|
values.
|
||||||
|
"""
|
||||||
|
return {
|
||||||
|
k: v if len(v) > 1 else v[0] for k, v in querydict.lists()
|
||||||
|
}
|
@ -1,8 +1,7 @@
|
|||||||
from django import template
|
from django import template
|
||||||
from django.http import QueryDict
|
|
||||||
|
|
||||||
from extras.choices import CustomFieldTypeChoices
|
from extras.choices import CustomFieldTypeChoices
|
||||||
from utilities.utils import dict_to_querydict
|
from utilities.querydict import dict_to_querydict
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'badge',
|
'badge',
|
||||||
|
@ -2,7 +2,8 @@ from django.http import QueryDict
|
|||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
from utilities.data import deepmerge
|
from utilities.data import deepmerge
|
||||||
from utilities.utils import dict_to_filter_params, normalize_querydict
|
from utilities.querydict import normalize_querydict
|
||||||
|
from utilities.utils import dict_to_filter_params
|
||||||
|
|
||||||
|
|
||||||
class DictToFilterParamsTest(TestCase):
|
class DictToFilterParamsTest(TestCase):
|
||||||
|
@ -4,7 +4,6 @@ from django.db.models import Count, ManyToOneRel, OuterRef, Subquery
|
|||||||
from django.db.models.functions import Coalesce
|
from django.db.models.functions import Coalesce
|
||||||
from django.http import QueryDict
|
from django.http import QueryDict
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.datastructures import MultiValueDict
|
|
||||||
from django.utils.timezone import localtime
|
from django.utils.timezone import localtime
|
||||||
|
|
||||||
from .string import title
|
from .string import title
|
||||||
@ -70,37 +69,6 @@ def dict_to_filter_params(d, prefix=''):
|
|||||||
return params
|
return params
|
||||||
|
|
||||||
|
|
||||||
def dict_to_querydict(d, mutable=True):
|
|
||||||
"""
|
|
||||||
Create a QueryDict instance from a regular Python dictionary.
|
|
||||||
"""
|
|
||||||
qd = QueryDict(mutable=True)
|
|
||||||
for k, v in d.items():
|
|
||||||
item = MultiValueDict({k: v}) if isinstance(v, (list, tuple, set)) else {k: v}
|
|
||||||
qd.update(item)
|
|
||||||
if not mutable:
|
|
||||||
qd._mutable = False
|
|
||||||
return qd
|
|
||||||
|
|
||||||
|
|
||||||
def normalize_querydict(querydict):
|
|
||||||
"""
|
|
||||||
Convert a QueryDict to a normal, mutable dictionary, preserving list values. For example,
|
|
||||||
|
|
||||||
QueryDict('foo=1&bar=2&bar=3&baz=')
|
|
||||||
|
|
||||||
becomes:
|
|
||||||
|
|
||||||
{'foo': '1', 'bar': ['2', '3'], 'baz': ''}
|
|
||||||
|
|
||||||
This function is necessary because QueryDict does not provide any built-in mechanism which preserves multiple
|
|
||||||
values.
|
|
||||||
"""
|
|
||||||
return {
|
|
||||||
k: v if len(v) > 1 else v[0] for k, v in querydict.lists()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def prepare_cloned_fields(instance):
|
def prepare_cloned_fields(instance):
|
||||||
"""
|
"""
|
||||||
Generate a QueryDict comprising attributes from an object's clone() method.
|
Generate a QueryDict comprising attributes from an object's clone() method.
|
||||||
|
Reference in New Issue
Block a user