1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Code cleanup

This commit is contained in:
Jeremy Stretch
2016-05-18 16:35:35 -04:00
parent f690be60fd
commit 7502a02fba
14 changed files with 58 additions and 50 deletions

View File

@ -7,10 +7,8 @@ from utilities.views import (
BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView, BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
) )
from . import forms from . import filters, forms, tables
from .filters import CircuitFilter
from .models import Circuit, CircuitType, Provider from .models import Circuit, CircuitType, Provider
from .tables import CircuitTable, CircuitTypeTable, ProviderTable
# #
@ -19,7 +17,7 @@ from .tables import CircuitTable, CircuitTypeTable, ProviderTable
class ProviderListView(ObjectListView): class ProviderListView(ObjectListView):
queryset = Provider.objects.annotate(count_circuits=Count('circuits')) queryset = Provider.objects.annotate(count_circuits=Count('circuits'))
table = ProviderTable table = tables.ProviderTable
edit_permissions = ['circuits.change_provider', 'circuits.delete_provider'] edit_permissions = ['circuits.change_provider', 'circuits.delete_provider']
template_name = 'circuits/provider_list.html' template_name = 'circuits/provider_list.html'
@ -52,7 +50,7 @@ class ProviderDeleteView(PermissionRequiredMixin, ObjectDeleteView):
class ProviderBulkImportView(PermissionRequiredMixin, BulkImportView): class ProviderBulkImportView(PermissionRequiredMixin, BulkImportView):
permission_required = 'circuits.add_provider' permission_required = 'circuits.add_provider'
form = forms.ProviderImportForm form = forms.ProviderImportForm
table = ProviderTable table = tables.ProviderTable
template_name = 'circuits/provider_import.html' template_name = 'circuits/provider_import.html'
obj_list_url = 'circuits:provider_list' obj_list_url = 'circuits:provider_list'
@ -88,7 +86,7 @@ class ProviderBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
class CircuitTypeListView(ObjectListView): class CircuitTypeListView(ObjectListView):
queryset = CircuitType.objects.annotate(circuit_count=Count('circuits')) queryset = CircuitType.objects.annotate(circuit_count=Count('circuits'))
table = CircuitTypeTable table = tables.CircuitTypeTable
edit_permissions = ['circuits.change_circuittype', 'circuits.delete_circuittype'] edit_permissions = ['circuits.change_circuittype', 'circuits.delete_circuittype']
template_name = 'circuits/circuittype_list.html' template_name = 'circuits/circuittype_list.html'
@ -114,9 +112,9 @@ class CircuitTypeBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
class CircuitListView(ObjectListView): class CircuitListView(ObjectListView):
queryset = Circuit.objects.select_related('provider', 'type', 'site') queryset = Circuit.objects.select_related('provider', 'type', 'site')
filter = CircuitFilter filter = filters.CircuitFilter
filter_form = forms.CircuitFilterForm filter_form = forms.CircuitFilterForm
table = CircuitTable table = tables.CircuitTable
edit_permissions = ['circuits.change_circuit', 'circuits.delete_circuit'] edit_permissions = ['circuits.change_circuit', 'circuits.delete_circuit']
template_name = 'circuits/circuit_list.html' template_name = 'circuits/circuit_list.html'
@ -148,7 +146,7 @@ class CircuitDeleteView(PermissionRequiredMixin, ObjectDeleteView):
class CircuitBulkImportView(PermissionRequiredMixin, BulkImportView): class CircuitBulkImportView(PermissionRequiredMixin, BulkImportView):
permission_required = 'circuits.add_circuit' permission_required = 'circuits.add_circuit'
form = forms.CircuitImportForm form = forms.CircuitImportForm
table = CircuitTable table = tables.CircuitTable
template_name = 'circuits/circuit_import.html' template_name = 'circuits/circuit_import.html'
obj_list_url = 'circuits:circuit_list' obj_list_url = 'circuits:circuit_list'

View File

@ -7,16 +7,22 @@ from users.views import login, logout
urlpatterns = [ urlpatterns = [
# Default page
url(r'^$', home, name='home'), url(r'^$', home, name='home'),
# Login/logout
url(r'^login/$', login, name='login'),
url(r'^logout/$', logout, name='logout'),
# Apps
url(r'^circuits/', include('circuits.urls', namespace='circuits')), url(r'^circuits/', include('circuits.urls', namespace='circuits')),
url(r'^dcim/', include('dcim.urls', namespace='dcim')), url(r'^dcim/', include('dcim.urls', namespace='dcim')),
url(r'^ipam/', include('ipam.urls', namespace='ipam')), url(r'^ipam/', include('ipam.urls', namespace='ipam')),
url(r'^secrets/', include('secrets.urls', namespace='secrets')), url(r'^secrets/', include('secrets.urls', namespace='secrets')),
url(r'^profile/', include('users.urls', namespace='users')), url(r'^profile/', include('users.urls', namespace='users')),
url(r'^login/$', login, name='login'), # API
url(r'^logout/$', logout, name='logout'),
url(r'^api/circuits/', include('circuits.api.urls', namespace='circuits-api')), url(r'^api/circuits/', include('circuits.api.urls', namespace='circuits-api')),
url(r'^api/dcim/', include('dcim.api.urls', namespace='dcim-api')), url(r'^api/dcim/', include('dcim.api.urls', namespace='dcim-api')),
url(r'^api/ipam/', include('ipam.api.urls', namespace='ipam-api')), url(r'^api/ipam/', include('ipam.api.urls', namespace='ipam-api')),
@ -28,5 +34,7 @@ urlpatterns = [
url(r'^404/$', page_not_found), url(r'^404/$', page_not_found),
url(r'^500/$', trigger_500), url(r'^500/$', trigger_500),
# Admin
url(r'^admin/', include(admin.site.urls)), url(r'^admin/', include(admin.site.urls)),
] ]

View File

@ -12,7 +12,8 @@ from rest_framework.views import APIView
from extras.api.renderers import FormlessBrowsableAPIRenderer, FreeRADIUSClientsRenderer from extras.api.renderers import FormlessBrowsableAPIRenderer, FreeRADIUSClientsRenderer
from secrets.filters import SecretFilter from secrets.filters import SecretFilter
from secrets.models import Secret, SecretRole, UserKey from secrets.models import Secret, SecretRole, UserKey
from .serializers import SecretRoleSerializer, SecretSerializer
from . import serializers
ERR_USERKEY_MISSING = "No UserKey found for the current user." ERR_USERKEY_MISSING = "No UserKey found for the current user."
@ -25,7 +26,7 @@ class SecretRoleListView(generics.ListAPIView):
List all secret roles List all secret roles
""" """
queryset = SecretRole.objects.all() queryset = SecretRole.objects.all()
serializer_class = SecretRoleSerializer serializer_class = serializers.SecretRoleSerializer
class SecretRoleDetailView(generics.RetrieveAPIView): class SecretRoleDetailView(generics.RetrieveAPIView):
@ -33,7 +34,7 @@ class SecretRoleDetailView(generics.RetrieveAPIView):
Retrieve a single secret role Retrieve a single secret role
""" """
queryset = SecretRole.objects.all() queryset = SecretRole.objects.all()
serializer_class = SecretRoleSerializer serializer_class = serializers.SecretRoleSerializer
class SecretListView(generics.GenericAPIView): class SecretListView(generics.GenericAPIView):
@ -42,7 +43,7 @@ class SecretListView(generics.GenericAPIView):
""" """
queryset = Secret.objects.select_related('device__primary_ip', 'role')\ queryset = Secret.objects.select_related('device__primary_ip', 'role')\
.prefetch_related('role__users', 'role__groups') .prefetch_related('role__users', 'role__groups')
serializer_class = SecretSerializer serializer_class = serializers.SecretSerializer
filter_class = SecretFilter filter_class = SecretFilter
renderer_classes = [FormlessBrowsableAPIRenderer, JSONRenderer, FreeRADIUSClientsRenderer] renderer_classes = [FormlessBrowsableAPIRenderer, JSONRenderer, FreeRADIUSClientsRenderer]
@ -87,7 +88,7 @@ class SecretDetailView(generics.GenericAPIView):
""" """
queryset = Secret.objects.select_related('device__primary_ip', 'role')\ queryset = Secret.objects.select_related('device__primary_ip', 'role')\
.prefetch_related('role__users', 'role__groups') .prefetch_related('role__users', 'role__groups')
serializer_class = SecretSerializer serializer_class = serializers.SecretSerializer
renderer_classes = [FormlessBrowsableAPIRenderer, JSONRenderer, FreeRADIUSClientsRenderer] renderer_classes = [FormlessBrowsableAPIRenderer, JSONRenderer, FreeRADIUSClientsRenderer]
def get(self, request, pk, private_key=None): def get(self, request, pk, private_key=None):

View File

@ -6,6 +6,7 @@ from django.db.models import Count
from dcim.models import Device from dcim.models import Device
from utilities.forms import BootstrapMixin, BulkImportForm, ConfirmationForm, CSVDataField from utilities.forms import BootstrapMixin, BulkImportForm, ConfirmationForm, CSVDataField
from .models import Secret, SecretRole, UserKey from .models import Secret, SecretRole, UserKey
@ -133,4 +134,3 @@ class UserKeyForm(forms.ModelForm, BootstrapMixin):
class ActivateUserKeyForm(forms.Form): class ActivateUserKeyForm(forms.Form):
_selected_action = forms.ModelMultipleChoiceField(queryset=UserKey.objects.all(), label='User Keys') _selected_action = forms.ModelMultipleChoiceField(queryset=UserKey.objects.all(), label='User Keys')
secret_key = forms.CharField(label='Your private key', widget=forms.Textarea(attrs={'class': 'vLargeTextField'})) secret_key = forms.CharField(label='Your private key', widget=forms.Textarea(attrs={'class': 'vLargeTextField'}))

View File

@ -11,6 +11,7 @@ from django.db import models
from django.utils.encoding import force_bytes from django.utils.encoding import force_bytes
from dcim.models import Device from dcim.models import Device
from .hashers import SecretValidationHasher from .hashers import SecretValidationHasher

View File

@ -5,7 +5,9 @@ from .models import SecretRole, Secret
SECRETROLE_EDIT_LINK = """ SECRETROLE_EDIT_LINK = """
{% if perms.secrets.change_secretrole %}<a href="{% url 'secrets:secretrole_edit' slug=record.slug %}">Edit</a>{% endif %} {% if perms.secrets.change_secretrole %}
<a href="{% url 'secrets:secretrole_edit' slug=record.slug %}">Edit</a>
{% endif %}
""" """

View File

@ -2,6 +2,7 @@ from django.conf.urls import url
from . import views from . import views
urlpatterns = [ urlpatterns = [
# Secret roles # Secret roles

View File

@ -8,14 +8,11 @@ from django.shortcuts import get_object_or_404, redirect, render
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from dcim.models import Device from dcim.models import Device
from utilities.views import BulkEditView, BulkDeleteView, ObjectListView, ObjectEditView, ObjectDeleteView from utilities.views import BulkDeleteView, BulkEditView, ObjectDeleteView, ObjectEditView, ObjectListView
from . import filters, forms, tables
from .decorators import userkey_required from .decorators import userkey_required
from .filters import SecretFilter
from .forms import SecretRoleForm, SecretRoleBulkDeleteForm, SecretForm, SecretImportForm, SecretBulkEditForm,\
SecretBulkDeleteForm, SecretFilterForm
from .models import SecretRole, Secret, UserKey from .models import SecretRole, Secret, UserKey
from .tables import SecretRoleTable, SecretTable
# #
@ -24,7 +21,7 @@ from .tables import SecretRoleTable, SecretTable
class SecretRoleListView(ObjectListView): class SecretRoleListView(ObjectListView):
queryset = SecretRole.objects.annotate(secret_count=Count('secrets')) queryset = SecretRole.objects.annotate(secret_count=Count('secrets'))
table = SecretRoleTable table = tables.SecretRoleTable
edit_permissions = ['secrets.change_secretrole', 'secrets.delete_secretrole'] edit_permissions = ['secrets.change_secretrole', 'secrets.delete_secretrole']
template_name = 'secrets/secretrole_list.html' template_name = 'secrets/secretrole_list.html'
@ -32,7 +29,7 @@ class SecretRoleListView(ObjectListView):
class SecretRoleEditView(PermissionRequiredMixin, ObjectEditView): class SecretRoleEditView(PermissionRequiredMixin, ObjectEditView):
permission_required = 'secrets.change_secretrole' permission_required = 'secrets.change_secretrole'
model = SecretRole model = SecretRole
form_class = SecretRoleForm form_class = forms.SecretRoleForm
success_url = 'secrets:secretrole_list' success_url = 'secrets:secretrole_list'
cancel_url = 'secrets:secretrole_list' cancel_url = 'secrets:secretrole_list'
@ -40,7 +37,7 @@ class SecretRoleEditView(PermissionRequiredMixin, ObjectEditView):
class SecretRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class SecretRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'secrets.delete_secretrole' permission_required = 'secrets.delete_secretrole'
cls = SecretRole cls = SecretRole
form = SecretRoleBulkDeleteForm form = forms.SecretRoleBulkDeleteForm
default_redirect_url = 'secrets:secretrole_list' default_redirect_url = 'secrets:secretrole_list'
@ -51,9 +48,9 @@ class SecretRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
@method_decorator(login_required, name='dispatch') @method_decorator(login_required, name='dispatch')
class SecretListView(ObjectListView): class SecretListView(ObjectListView):
queryset = Secret.objects.select_related('role').prefetch_related('device') queryset = Secret.objects.select_related('role').prefetch_related('device')
filter = SecretFilter filter = filters.SecretFilter
filter_form = SecretFilterForm filter_form = forms.SecretFilterForm
table = SecretTable table = tables.SecretTable
edit_permissions = ['secrets.change_secret', 'secrets.delete_secret'] edit_permissions = ['secrets.change_secret', 'secrets.delete_secret']
template_name = 'secrets/secret_list.html' template_name = 'secrets/secret_list.html'
@ -79,7 +76,7 @@ def secret_add(request, pk):
uk = UserKey.objects.get(user=request.user) uk = UserKey.objects.get(user=request.user)
if request.method == 'POST': if request.method == 'POST':
form = SecretForm(request.POST, instance=secret) form = forms.SecretForm(request.POST, instance=secret)
if form.is_valid(): if form.is_valid():
# Retrieve the master key from the current user's UserKey # Retrieve the master key from the current user's UserKey
@ -101,7 +98,7 @@ def secret_add(request, pk):
return redirect('secrets:secret', pk=secret.pk) return redirect('secrets:secret', pk=secret.pk)
else: else:
form = SecretForm(instance=secret) form = forms.SecretForm(instance=secret)
return render(request, 'secrets/secret_edit.html', { return render(request, 'secrets/secret_edit.html', {
'secret': secret, 'secret': secret,
@ -118,7 +115,7 @@ def secret_edit(request, pk):
uk = UserKey.objects.get(user=request.user) uk = UserKey.objects.get(user=request.user)
if request.method == 'POST': if request.method == 'POST':
form = SecretForm(request.POST, instance=secret) form = forms.SecretForm(request.POST, instance=secret)
if form.is_valid(): if form.is_valid():
# Re-encrypt the Secret if a plaintext has been specified. # Re-encrypt the Secret if a plaintext has been specified.
@ -143,7 +140,7 @@ def secret_edit(request, pk):
return redirect('secrets:secret', pk=secret.pk) return redirect('secrets:secret', pk=secret.pk)
else: else:
form = SecretForm(instance=secret) form = forms.SecretForm(instance=secret)
return render(request, 'secrets/secret_edit.html', { return render(request, 'secrets/secret_edit.html', {
'secret': secret, 'secret': secret,
@ -165,7 +162,7 @@ def secret_import(request):
uk = UserKey.objects.get(user=request.user) uk = UserKey.objects.get(user=request.user)
if request.method == 'POST': if request.method == 'POST':
form = SecretImportForm(request.POST) form = forms.SecretImportForm(request.POST)
if form.is_valid(): if form.is_valid():
new_secrets = [] new_secrets = []
@ -183,7 +180,7 @@ def secret_import(request):
secret.save() secret.save()
new_secrets.append(secret) new_secrets.append(secret)
table = SecretTable(new_secrets) table = tables.SecretTable(new_secrets)
messages.success(request, "Imported {} new secrets".format(len(new_secrets))) messages.success(request, "Imported {} new secrets".format(len(new_secrets)))
return render(request, 'import_success.html', { return render(request, 'import_success.html', {
@ -194,7 +191,7 @@ def secret_import(request):
form.add_error('csv', "Record {}: {}".format(len(new_secrets) + 1, e.__cause__)) form.add_error('csv', "Record {}: {}".format(len(new_secrets) + 1, e.__cause__))
else: else:
form = SecretImportForm() form = forms.SecretImportForm()
return render(request, 'secrets/secret_import.html', { return render(request, 'secrets/secret_import.html', {
'form': form, 'form': form,
@ -205,7 +202,7 @@ def secret_import(request):
class SecretBulkEditView(PermissionRequiredMixin, BulkEditView): class SecretBulkEditView(PermissionRequiredMixin, BulkEditView):
permission_required = 'secrets.change_secret' permission_required = 'secrets.change_secret'
cls = Secret cls = Secret
form = SecretBulkEditForm form = forms.SecretBulkEditForm
template_name = 'secrets/secret_bulk_edit.html' template_name = 'secrets/secret_bulk_edit.html'
default_redirect_url = 'secrets:secret_list' default_redirect_url = 'secrets:secret_list'
@ -223,5 +220,5 @@ class SecretBulkEditView(PermissionRequiredMixin, BulkEditView):
class SecretBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class SecretBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'secrets.delete_secret' permission_required = 'secrets.delete_secret'
cls = Secret cls = Secret
form = SecretBulkDeleteForm form = forms.SecretBulkDeleteForm
default_redirect_url = 'secrets:secret_list' default_redirect_url = 'secrets:secret_list'

View File

@ -1,3 +0,0 @@
from django.contrib import admin
# Register your models here.

View File

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

View File

@ -2,9 +2,13 @@ from django.conf.urls import url
from . import views from . import views
urlpatterns = [ urlpatterns = [
# User profiles
url(r'^profile/$', views.profile, name='profile'), url(r'^profile/$', views.profile, name='profile'),
url(r'^profile/password/$', views.change_password, name='change_password'), url(r'^profile/password/$', views.change_password, name='change_password'),
url(r'^profile/user-key/$', views.userkey, name='userkey'), url(r'^profile/user-key/$', views.userkey, name='userkey'),
url(r'^profile/user-key/edit/$', views.userkey_edit, name='userkey_edit'), url(r'^profile/user-key/edit/$', views.userkey_edit, name='userkey_edit'),
] ]

View File

@ -9,6 +9,7 @@ from django.utils.http import is_safe_url
from secrets.forms import UserKeyForm from secrets.forms import UserKeyForm
from secrets.models import UserKey from secrets.models import UserKey
from .forms import LoginForm, PasswordChangeForm from .forms import LoginForm, PasswordChangeForm

View File

@ -3,7 +3,6 @@ from django.db import models
class NullableCharField(models.CharField): class NullableCharField(models.CharField):
description = "Stores empty values as NULL rather than ''" description = "Stores empty values as NULL rather than ''"
#__metaclass__ = models.SubfieldBase
def to_python(self, value): def to_python(self, value):
if isinstance(value, models.CharField): if isinstance(value, models.CharField):

View File

@ -1,8 +1,10 @@
from django_tables2 import RequestConfig
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.admin.views.decorators import staff_member_required from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse, NoReverseMatch from django.core.urlresolvers import reverse
from django.db import transaction, IntegrityError from django.db import transaction, IntegrityError
from django.db.models import ProtectedError from django.db.models import ProtectedError
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
@ -12,12 +14,11 @@ from django.utils.decorators import method_decorator
from django.utils.http import is_safe_url from django.utils.http import is_safe_url
from django.views.generic import View from django.views.generic import View
from django_tables2 import RequestConfig from extras.models import ExportTemplate
from .error_handlers import handle_protectederror from .error_handlers import handle_protectederror
from .forms import ConfirmationForm from .forms import ConfirmationForm
from .paginator import EnhancedPaginator from .paginator import EnhancedPaginator
from extras.models import ExportTemplate
class ObjectListView(View): class ObjectListView(View):
@ -45,7 +46,8 @@ class ObjectListView(View):
filename='netbox_{}'.format(self.queryset.model._meta.verbose_name_plural)) filename='netbox_{}'.format(self.queryset.model._meta.verbose_name_plural))
return response return response
except TemplateSyntaxError: except TemplateSyntaxError:
messages.error(request, "There was an error rendering the selected export template ({}).".format(et.name)) messages.error(request, "There was an error rendering the selected export template ({})."
.format(et.name))
# Attempt to redirect automatically if the query returns a single result # Attempt to redirect automatically if the query returns a single result
if self.redirect_on_single_result and self.queryset.count() == 1: if self.redirect_on_single_result and self.queryset.count() == 1: