diff --git a/netbox/circuits/models.py b/netbox/circuits/models.py index 6a0380dd5..5dc55d503 100644 --- a/netbox/circuits/models.py +++ b/netbox/circuits/models.py @@ -1,6 +1,6 @@ from django.contrib.contenttypes.fields import GenericRelation -from django.core.urlresolvers import reverse from django.db import models +from django.urls import reverse from django.utils.encoding import python_2_unicode_compatible from dcim.fields import ASNField @@ -150,7 +150,9 @@ class CircuitTermination(models.Model): circuit = models.ForeignKey('Circuit', related_name='terminations', on_delete=models.CASCADE) term_side = models.CharField(max_length=1, choices=TERM_SIDE_CHOICES, verbose_name='Termination') site = models.ForeignKey('dcim.Site', related_name='circuit_terminations', on_delete=models.PROTECT) - interface = models.OneToOneField('dcim.Interface', related_name='circuit_termination', blank=True, null=True) + interface = models.OneToOneField( + 'dcim.Interface', related_name='circuit_termination', blank=True, null=True, on_delete=models.CASCADE + ) port_speed = models.PositiveIntegerField(verbose_name='Port speed (Kbps)') upstream_speed = models.PositiveIntegerField(blank=True, null=True, verbose_name='Upstream speed (Kbps)', help_text='Upstream speed, if different from port speed') diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 1ffda899b..15903eb7e 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -1,10 +1,10 @@ from django.contrib import messages from django.contrib.auth.decorators import permission_required from django.contrib.auth.mixins import PermissionRequiredMixin -from django.core.urlresolvers import reverse from django.db import transaction from django.db.models import Count from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse from extras.models import Graph, GRAPH_TYPE_PROVIDER from utilities.forms import ConfirmationForm diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index fae85e2c1..df6f1fe57 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -8,10 +8,10 @@ from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericRelation from django.contrib.postgres.fields import ArrayField from django.core.exceptions import ValidationError -from django.core.urlresolvers import reverse from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.db.models import Count, Q, ObjectDoesNotExist +from django.urls import reverse from django.utils.encoding import python_2_unicode_compatible from circuits.models import Circuit @@ -211,7 +211,9 @@ class Region(MPTTModel): """ Sites can be grouped within geographic Regions. """ - parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True) + parent = TreeForeignKey( + 'self', null=True, blank=True, related_name='children', db_index=True, on_delete=models.CASCADE + ) name = models.CharField(max_length=50, unique=True) slug = models.SlugField(unique=True) @@ -314,7 +316,7 @@ class RackGroup(models.Model): """ name = models.CharField(max_length=50) slug = models.SlugField() - site = models.ForeignKey('Site', related_name='rack_groups') + site = models.ForeignKey('Site', related_name='rack_groups', on_delete=models.CASCADE) class Meta: ordering = ['site', 'name'] diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index e8e46d151..c356d683d 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -6,10 +6,10 @@ from operator import attrgetter from django.contrib import messages from django.contrib.auth.decorators import permission_required from django.contrib.auth.mixins import PermissionRequiredMixin -from django.core.urlresolvers import reverse from django.db.models import Count from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse from django.utils.http import urlencode from django.views.generic import View diff --git a/netbox/extras/models.py b/netbox/extras/models.py index d7889fb83..d45eac4cb 100644 --- a/netbox/extras/models.py +++ b/netbox/extras/models.py @@ -165,7 +165,7 @@ class CustomField(models.Model): @python_2_unicode_compatible class CustomFieldValue(models.Model): - field = models.ForeignKey('CustomField', related_name='values') + field = models.ForeignKey('CustomField', related_name='values', on_delete=models.CASCADE) obj_type = models.ForeignKey(ContentType, related_name='+', on_delete=models.PROTECT) obj_id = models.PositiveIntegerField() obj = GenericForeignKey('obj_type', 'obj_id') @@ -254,7 +254,9 @@ class Graph(models.Model): @python_2_unicode_compatible class ExportTemplate(models.Model): - content_type = models.ForeignKey(ContentType, limit_choices_to={'model__in': EXPORTTEMPLATE_MODELS}) + content_type = models.ForeignKey( + ContentType, limit_choices_to={'model__in': EXPORTTEMPLATE_MODELS}, on_delete=models.CASCADE + ) name = models.CharField(max_length=100) description = models.CharField(max_length=200, blank=True) template_code = models.TextField() @@ -294,7 +296,7 @@ class ExportTemplate(models.Model): class TopologyMap(models.Model): name = models.CharField(max_length=50, unique=True) slug = models.SlugField(unique=True) - site = models.ForeignKey('dcim.Site', related_name='topology_maps', blank=True, null=True) + site = models.ForeignKey('dcim.Site', related_name='topology_maps', blank=True, null=True, on_delete=models.CASCADE) device_patterns = models.TextField( help_text="Identify devices to include in the diagram using regular expressions, one per line. Each line will " "result in a new tier of the drawing. Separate multiple regexes within a line using semicolons. " @@ -384,7 +386,7 @@ class ImageAttachment(models.Model): """ An uploaded image which is associated with an object. """ - content_type = models.ForeignKey(ContentType) + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() parent = GenericForeignKey('content_type', 'object_id') image = models.ImageField(upload_to=image_upload, height_field='image_height', width_field='image_width') diff --git a/netbox/ipam/models.py b/netbox/ipam/models.py index 51807d0fa..0bed7615e 100644 --- a/netbox/ipam/models.py +++ b/netbox/ipam/models.py @@ -3,10 +3,10 @@ from netaddr import IPNetwork, cidr_merge from django.conf import settings from django.contrib.contenttypes.fields import GenericRelation from django.core.exceptions import ValidationError -from django.core.urlresolvers import reverse from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.db.models.expressions import RawSQL +from django.urls import reverse from django.utils.encoding import python_2_unicode_compatible from dcim.models import Interface diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 864909878..6a10859e1 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -5,9 +5,9 @@ from django.conf import settings from django.contrib.auth.decorators import permission_required from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib import messages -from django.core.urlresolvers import reverse from django.db.models import Count, Q from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse from dcim.models import Device from utilities.forms import ConfirmationForm diff --git a/netbox/secrets/models.py b/netbox/secrets/models.py index 9afe2af84..2692a5113 100644 --- a/netbox/secrets/models.py +++ b/netbox/secrets/models.py @@ -6,8 +6,8 @@ from django.conf import settings from django.contrib.auth.hashers import make_password, check_password from django.contrib.auth.models import Group, User from django.core.exceptions import ValidationError -from django.core.urlresolvers import reverse from django.db import models +from django.urls import reverse from django.utils.encoding import force_bytes, python_2_unicode_compatible from dcim.models import Device @@ -69,7 +69,7 @@ class UserKey(CreatedUpdatedModel): copy of the master encryption key. The encrypted instance of the master key can be decrypted only with the user's matching (private) decryption key. """ - user = models.OneToOneField(User, related_name='user_key', editable=False) + user = models.OneToOneField(User, related_name='user_key', editable=False, on_delete=models.CASCADE) public_key = models.TextField(verbose_name='RSA public key') master_key_cipher = models.BinaryField(max_length=512, blank=True, null=True, editable=False) @@ -283,7 +283,7 @@ class Secret(CreatedUpdatedModel): A Secret can be up to 65,536 bytes (64KB) in length. Each secret string will be padded with random data to a minimum of 64 bytes during encryption in order to protect short strings from ciphertext analysis. """ - device = models.ForeignKey(Device, related_name='secrets') + device = models.ForeignKey(Device, related_name='secrets', on_delete=models.CASCADE) role = models.ForeignKey('SecretRole', related_name='secrets', on_delete=models.PROTECT) name = models.CharField(max_length=100, blank=True) ciphertext = models.BinaryField(editable=False, max_length=65568) # 16B IV + 2B pad length + {62-65550}B padded diff --git a/netbox/secrets/views.py b/netbox/secrets/views.py index 308e9de3d..653fd06fe 100644 --- a/netbox/secrets/views.py +++ b/netbox/secrets/views.py @@ -3,10 +3,10 @@ import base64 from django.contrib import messages from django.contrib.auth.decorators import permission_required, login_required from django.contrib.auth.mixins import PermissionRequiredMixin -from django.core.urlresolvers import reverse from django.db import transaction, IntegrityError from django.db.models import Count from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse from django.utils.decorators import method_decorator from dcim.models import Device diff --git a/netbox/tenancy/models.py b/netbox/tenancy/models.py index df871fc31..203dc7e41 100644 --- a/netbox/tenancy/models.py +++ b/netbox/tenancy/models.py @@ -1,6 +1,6 @@ from django.contrib.contenttypes.fields import GenericRelation -from django.core.urlresolvers import reverse from django.db import models +from django.urls import reverse from django.utils.encoding import python_2_unicode_compatible from extras.models import CustomFieldModel, CustomFieldValue diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index f4bb05b69..0f70fa6d0 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -1,7 +1,7 @@ from django.contrib.auth.mixins import PermissionRequiredMixin -from django.core.urlresolvers import reverse from django.db.models import Count, Q from django.shortcuts import get_object_or_404, render +from django.urls import reverse from circuits.models import Circuit from dcim.models import Site, Rack, Device diff --git a/netbox/users/views.py b/netbox/users/views.py index 711c5a9c0..03e913742 100644 --- a/netbox/users/views.py +++ b/netbox/users/views.py @@ -2,9 +2,9 @@ from django.contrib import messages from django.contrib.auth import login as auth_login, logout as auth_logout, update_session_auth_hash from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import LoginRequiredMixin -from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse from django.utils.http import is_safe_url from django.views.generic import View diff --git a/netbox/utilities/forms.py b/netbox/utilities/forms.py index 6813c0553..05e7a528e 100644 --- a/netbox/utilities/forms.py +++ b/netbox/utilities/forms.py @@ -6,8 +6,8 @@ from mptt.forms import TreeNodeMultipleChoiceField from django import forms from django.conf import settings -from django.core.urlresolvers import reverse_lazy from django.core.validators import URLValidator +from django.urls import reverse_lazy COLOR_CHOICES = ( diff --git a/netbox/utilities/middleware.py b/netbox/utilities/middleware.py index 4ebfee3ed..22697d179 100644 --- a/netbox/utilities/middleware.py +++ b/netbox/utilities/middleware.py @@ -1,6 +1,6 @@ from django.http import HttpResponseRedirect from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse BASE_PATH = getattr(settings, 'BASE_PATH', False) diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index 1c3e74b30..0bf56f0fe 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -5,13 +5,13 @@ from django.conf import settings from django.contrib import messages from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError -from django.core.urlresolvers import reverse from django.db import transaction, IntegrityError from django.db.models import ProtectedError from django.forms import CharField, ModelMultipleChoiceField, MultipleHiddenInput, TypedChoiceField from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.template import TemplateSyntaxError +from django.urls import reverse from django.utils.http import is_safe_url from django.views.generic import View