Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stop supporting Django's older than 3.2 #2823

Merged
merged 4 commits into from Feb 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion bin/smsd.py
Expand Up @@ -29,7 +29,7 @@
import sys
import time

from nav.compatibility import smart_str
from django.utils.encoding import smart_str

import nav.config
import nav.daemon
Expand Down
2 changes: 1 addition & 1 deletion python/nav/auditlog/models.py
Expand Up @@ -18,7 +18,7 @@
from __future__ import unicode_literals, absolute_import

import logging
from nav.compatibility import force_str
from django.utils.encoding import force_str

from django.db import models
from django.utils.timezone import now as utcnow
Expand Down
2 changes: 1 addition & 1 deletion python/nav/auditlog/utils.py
Expand Up @@ -16,7 +16,7 @@
#
from __future__ import unicode_literals

from nav.compatibility import force_str
from django.utils.encoding import force_str
from django.db.models import Q

from . import find_modelname
Expand Down
16 changes: 0 additions & 16 deletions python/nav/compatibility.py
@@ -1,19 +1,3 @@
# Django 2.2 has only *_text, Django 3.2 has both *_text and *_str,
# Django 4.0 has only *_str. These are imported so many places that
# it is better to do it once, hence this file

# When no longer supporting 2.2:
# s/nav.compatibility \(import \w+_str\)/django.utils.encoding \1/
try:
from django.utils.encoding import force_str
except ImportError:
from django.utils.encoding import force_text as force_str

try:
from django.utils.encoding import smart_str
except ImportError:
from django.utils.encoding import smart_text as smart_str

# lru_cache isn't used that much but one application of sed is faster
# than changing a block into a line three times.

Expand Down
5 changes: 1 addition & 4 deletions python/nav/django/legacy.py
Expand Up @@ -15,10 +15,7 @@
#
"""Various functionality to bridge legacy NAV code with Django"""

try:
from django.utils.deprecation import MiddlewareMixin
except ImportError: # Django <= 1.9
MiddlewareMixin = object
from django.utils.deprecation import MiddlewareMixin

from nav import db

Expand Down
2 changes: 0 additions & 2 deletions python/nav/django/settings.py
Expand Up @@ -132,8 +132,6 @@
'nav.django.legacy.LegacyCleanupMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
if django.VERSION[:2] == (1, 8): # Django <= 1.8
MIDDLEWARE_CLASSES = MIDDLEWARE

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
Expand Down
6 changes: 1 addition & 5 deletions python/nav/django/utils.py
Expand Up @@ -60,11 +60,7 @@ def get_verbose_name(model, lookup):

foreign_key, lookup = lookup.split('__', 1)
try:
foreign_model_field = model._meta.get_field(foreign_key)
try:
foreign_model = foreign_model_field.remote_field.model
except AttributeError: # Django <= 1.8
foreign_model = foreign_model_field.rel.to
foreign_model = model._meta.get_field(foreign_key).remote_field.model
return get_verbose_name(foreign_model, lookup)
except FieldDoesNotExist:
pass
Expand Down
5 changes: 1 addition & 4 deletions python/nav/ipdevpoll/storage.py
Expand Up @@ -264,10 +264,7 @@ def get_dependencies(cls):
dependencies = []
for field in cls._meta.fields:
if issubclass(field.__class__, django.db.models.fields.related.ForeignKey):
try:
django_dependency = field.remote_field.model
except AttributeError: # Django <= 1.8
django_dependency = field.rel.to
django_dependency = field.remote_field.model

shadow_dependency = MetaShadow.shadowed_classes.get(
django_dependency, None
Expand Down
2 changes: 1 addition & 1 deletion python/nav/mibs/cisco_process_mib.py
Expand Up @@ -16,7 +16,7 @@
#
from twisted.internet import defer

from nav.compatibility import smart_str
from django.utils.encoding import smart_str

from nav.smidumps import get_mib
from nav.mibs import mibretriever
Expand Down
2 changes: 1 addition & 1 deletion python/nav/mibs/itw_mib.py
Expand Up @@ -22,7 +22,7 @@
Uses the vendor-specifica IT-WATCHDOGS-MIB to detect and collect
sensor-information.
"""
from nav.compatibility import smart_str
from django.utils.encoding import smart_str
from twisted.internet import defer

from nav.mibs import reduce_index
Expand Down
28 changes: 6 additions & 22 deletions python/nav/models/fields.py
Expand Up @@ -73,15 +73,9 @@ class DictAsJsonField(models.TextField):
def db_type(self, connection):
return 'varchar'

if django.VERSION < (2,): # Django < 2.x
# pylint: disable=unused-argument
def from_db_value(self, value, expression, connection, context):
return self.to_python(value)

else:
# pylint: disable=unused-argument
def from_db_value(self, value, expression, connection):
return self.to_python(value)
# pylint: disable=unused-argument
def from_db_value(self, value, expression, connection):
return self.to_python(value)

def to_python(self, value):
if value:
Expand Down Expand Up @@ -128,15 +122,8 @@ def __init__(self, *args, **kwargs):
def db_type(self, connection):
return 'point'

if django.VERSION < (2,): # Django < 2.x

def from_db_value(self, value, expression, connection, context):
return self.to_python(value)

else:

def from_db_value(self, value, expression, connection):
return self.to_python(value)
def from_db_value(self, value, expression, connection):
return self.to_python(value)

def to_python(self, value):
if not value or isinstance(value, tuple):
Expand Down Expand Up @@ -196,10 +183,7 @@ def contribute_to_class(self, cls, name):
self.name = name
self.model = cls
self.cache_attr = "_%s_cache" % name
if django.VERSION[:2] == (1, 8): # Django <= 1.8
cls._meta.virtual_fields.append(self)
else:
cls._meta.private_fields.append(self)
cls._meta.private_fields.append(self)

if not cls._meta.abstract:
signals.pre_init.connect(self.instance_pre_init, sender=cls)
Expand Down
2 changes: 1 addition & 1 deletion python/nav/web/api/v1/alert_serializers.py
Expand Up @@ -18,7 +18,7 @@
from django.core.exceptions import ObjectDoesNotExist
from django.template.defaultfilters import urlize
from django.urls import reverse
from nav.compatibility import force_str
from django.utils.encoding import force_str
from django.utils.html import strip_tags
from rest_framework import serializers

Expand Down
5 changes: 1 addition & 4 deletions python/nav/web/api/v1/views.py
Expand Up @@ -186,10 +186,7 @@ def is_valid_field(self, model, field):

# foreign key
if len(components) == 2:
try:
remote_model = field.remote_field.model
except AttributeError: # Django <= 1.8
remote_model = field.rel.to
remote_model = field.remote_field.model
if remote_model:
return self.is_valid_field(remote_model, components[1])
return True
Expand Down
6 changes: 1 addition & 5 deletions python/nav/web/auth/middleware.py
Expand Up @@ -21,11 +21,7 @@
import os

from django.http import HttpResponseRedirect, HttpResponse

try:
from django.utils.deprecation import MiddlewareMixin
except ImportError: # Django <= 1.9
MiddlewareMixin = object
from django.utils.deprecation import MiddlewareMixin

from nav.models.profiles import Account
from nav.web.auth import remote_user, get_login_url, logout
Expand Down
2 changes: 1 addition & 1 deletion python/nav/web/useradmin/forms.py
Expand Up @@ -19,7 +19,7 @@
from datetime import date, timedelta

from django import forms
from nav.compatibility import force_str
from django.utils.encoding import force_str

from crispy_forms.helper import FormHelper
from crispy_forms_foundation.layout import (
Expand Down
1 change: 0 additions & 1 deletion requirements/django22.txt

This file was deleted.

2 changes: 1 addition & 1 deletion tests/integration/api_test.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from __future__ import print_function
from nav.compatibility import force_str
from django.utils.encoding import force_str

from datetime import datetime, timedelta
import json
Expand Down
14 changes: 5 additions & 9 deletions tests/integration/models/model_test.py
Expand Up @@ -8,15 +8,11 @@

from django.db import connection

try:
# Django >= 1.8
import django.apps

get_models = django.apps.apps.get_models
del django.apps
except ImportError:
# Django < 1.9
from django.db.models import get_models
import django.apps

get_models = django.apps.apps.get_models
del django.apps


import pytest

Expand Down
2 changes: 1 addition & 1 deletion tests/integration/seeddb_test.py
Expand Up @@ -5,7 +5,7 @@
from django.test.client import RequestFactory
from mock import MagicMock

from nav.compatibility import smart_str
from django.utils.encoding import smart_str
from nav.models.manage import Netbox, Room
from nav.web.seeddb.page.netbox.edit import netbox_edit, log_netbox_change
from nav.web.seeddb.utils.delete import dependencies
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/web/alertprofiles_test.py
Expand Up @@ -7,7 +7,7 @@

from django.test.client import RequestFactory
from django.urls import reverse
from nav.compatibility import smart_str
from django.utils.encoding import smart_str
from nav.models.profiles import (
AlertAddress,
AlertPreference,
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/web/devicehistory_test.py
Expand Up @@ -4,7 +4,7 @@
from nav.models.event import EventQueue, EventQueueVar

from django.urls import reverse
from nav.compatibility import smart_str
from django.utils.encoding import smart_str


def test_post_device_error_should_succeed(client, localhost):
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/web/ipdevinfo_test.py
Expand Up @@ -2,7 +2,7 @@
from __future__ import print_function

from django.urls import reverse
from nav.compatibility import smart_str
from django.utils.encoding import smart_str

from nav.models.manage import Netbox, Module, Interface, Device, NetboxProfile
from nav.web.ipdevinfo.utils import get_module_view
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/web/maintenance/views_test.py
Expand Up @@ -18,7 +18,7 @@
import pytest
from django.urls import reverse

from nav.compatibility import smart_str
from django.utils.encoding import smart_str
from nav.models.manage import Netbox
from nav.models.msgmaint import MaintenanceTask

Expand Down
2 changes: 1 addition & 1 deletion tests/integration/web/netboxtype_test.py
Expand Up @@ -5,7 +5,7 @@
from nav.web.seeddb.forms import SEPARATOR

from django.urls import reverse
from nav.compatibility import smart_str
from django.utils.encoding import smart_str


def test_post_netboxtype_with_sysobjectid_without_leading_period_should_succeed(client):
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/web/prefixviewset_test.py
Expand Up @@ -2,7 +2,7 @@
import pytest

from nav.models.manage import Prefix, Vlan, NetType
from nav.compatibility import force_str
from django.utils.encoding import force_str
from nav.web.api.v1.views import get_endpoints

ENDPOINTS = {name: force_str(url) for name, url in get_endpoints().items()}
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/web/webfront_test.py
@@ -1,7 +1,7 @@
from mock import Mock

from django.urls import reverse
from nav.compatibility import smart_str
from django.utils.encoding import smart_str
from nav.models.profiles import AccountDashboard
from nav.web.webfront.utils import tool_list

Expand Down