Merge branch 'develop' into 17954_cable_bulk_import_circuit_terminations

This commit is contained in:
Jonathan Senecal 2024-11-12 15:48:32 -05:00 committed by GitHub
commit 98c2b2f504
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 65 additions and 13 deletions

View File

@ -346,3 +346,32 @@ class BackgroundTaskTestCase(TestCase):
self.assertIn(str(worker1.name), str(response.content))
self.assertIn('Birth', str(response.content))
self.assertIn('Total working time', str(response.content))
class SystemTestCase(TestCase):
def setUp(self):
super().setUp()
self.user.is_staff = True
self.user.save()
def test_system_view_default(self):
# Test UI render
response = self.client.get(reverse('core:system'))
self.assertEqual(response.status_code, 200)
# Test export
response = self.client.get(f"{reverse('core:system')}?export=true")
self.assertEqual(response.status_code, 200)
def test_system_view_with_config_revision(self):
ConfigRevision.objects.create()
# Test UI render
response = self.client.get(reverse('core:system'))
self.assertEqual(response.status_code, 200)
# Test export
response = self.client.get(f"{reverse('core:system')}?export=true")
self.assertEqual(response.status_code, 200)

View File

@ -626,11 +626,7 @@ class SystemView(UserPassesTestMixin, View):
}
# Configuration
try:
config = ConfigRevision.objects.get(pk=cache.get('config_version'))
except ConfigRevision.DoesNotExist:
# Fall back to using the active config data if no record is found
config = get_config()
config = get_config()
# Raw data export
if 'export' in request.GET:

View File

@ -1,7 +1,7 @@
import urllib.parse
from django.urls import reverse
from django.test import override_settings
from django.test import Client, override_settings
from dcim.models import Site
from netbox.constants import EMPTY_TABLE_TEXT
@ -74,3 +74,21 @@ class SearchViewTestCase(TestCase):
self.assertHttpStatus(response, 200)
content = str(response.content)
self.assertIn(EMPTY_TABLE_TEXT, content)
class MediaViewTestCase(TestCase):
def test_media_login_required(self):
url = reverse('media', kwargs={'path': 'foo.txt'})
response = Client().get(url)
# Unauthenticated request should redirect to login page
self.assertHttpStatus(response, 302)
@override_settings(LOGIN_REQUIRED=False)
def test_media_login_not_required(self):
url = reverse('media', kwargs={'path': 'foo.txt'})
response = Client().get(url)
# Unauthenticated request should return a 404 (not found)
self.assertHttpStatus(response, 404)

View File

@ -2,7 +2,6 @@ from django.conf import settings
from django.conf.urls import include
from django.urls import path
from django.views.decorators.cache import cache_page
from django.views.static import serve
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
from account.views import LoginView, LogoutView
@ -10,7 +9,7 @@ from netbox.api.views import APIRootView, StatusView
from netbox.graphql.schema import schema
from netbox.graphql.views import NetBoxGraphQLView
from netbox.plugins.urls import plugin_patterns, plugin_api_patterns
from netbox.views import HomeView, StaticMediaFailureView, SearchView, htmx
from netbox.views import HomeView, MediaView, StaticMediaFailureView, SearchView, htmx
_patterns = [
@ -69,7 +68,7 @@ _patterns = [
path('graphql/', NetBoxGraphQLView.as_view(schema=schema), name='graphql'),
# Serving static media in Django to pipe it through LoginRequiredMiddleware
path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT}),
path('media/<path:path>', MediaView.as_view(), name='media'),
path('media-failure/', StaticMediaFailureView.as_view(), name='media_failure'),
# Plugins

View File

@ -698,7 +698,7 @@ class BulkEditView(GetReturnURLMixin, BaseMultiObjectView):
logger.debug("Form validation failed")
else:
form = self.form(request.POST, initial=initial_data)
form = self.form(initial=initial_data)
restrict_form_fields(form, request.user)
# Retrieve objects being edited

View File

@ -8,6 +8,7 @@ from django.core.cache import cache
from django.shortcuts import redirect, render
from django.utils.translation import gettext_lazy as _
from django.views.generic import View
from django.views.static import serve
from django_tables2 import RequestConfig
from packaging import version
@ -23,6 +24,7 @@ from utilities.views import ConditionalLoginRequiredMixin
__all__ = (
'HomeView',
'MediaView',
'SearchView',
)
@ -115,3 +117,11 @@ class SearchView(ConditionalLoginRequiredMixin, View):
'form': form,
'table': table,
})
class MediaView(ConditionalLoginRequiredMixin, View):
"""
Wrap Django's serve() view to enforce LOGIN_REQUIRED for static media.
"""
def get(self, request, path):
return serve(request, path, document_root=settings.MEDIA_ROOT)

View File

@ -171,7 +171,7 @@ class VirtualMachineBulkEditForm(NetBoxModelBulkEditForm):
)
disk = forms.IntegerField(
required=False,
label=_('Disk (GB)')
label=_('Disk (MB)')
)
description = forms.CharField(
label=_('Description'),
@ -331,7 +331,7 @@ class VirtualDiskBulkEditForm(NetBoxModelBulkEditForm):
)
size = forms.IntegerField(
required=False,
label=_('Size (GB)')
label=_('Size (MB)')
)
description = forms.CharField(
label=_('Description'),

View File

@ -248,7 +248,7 @@ class VirtualDiskFilterForm(NetBoxModelFilterSetForm):
label=_('Virtual machine')
)
size = forms.IntegerField(
label=_('Size (GB)'),
label=_('Size (MB)'),
required=False,
min_value=1
)