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

View File

@ -7,16 +7,22 @@ from users.views import login, logout
urlpatterns = [
# Default page
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'^dcim/', include('dcim.urls', namespace='dcim')),
url(r'^ipam/', include('ipam.urls', namespace='ipam')),
url(r'^secrets/', include('secrets.urls', namespace='secrets')),
url(r'^profile/', include('users.urls', namespace='users')),
url(r'^login/$', login, name='login'),
url(r'^logout/$', logout, name='logout'),
# 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/ipam/', include('ipam.api.urls', namespace='ipam-api')),
@ -28,5 +34,7 @@ urlpatterns = [
url(r'^404/$', page_not_found),
url(r'^500/$', trigger_500),
# Admin
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 secrets.filters import SecretFilter
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."
@ -25,7 +26,7 @@ class SecretRoleListView(generics.ListAPIView):
List all secret roles
"""
queryset = SecretRole.objects.all()
serializer_class = SecretRoleSerializer
serializer_class = serializers.SecretRoleSerializer
class SecretRoleDetailView(generics.RetrieveAPIView):
@ -33,7 +34,7 @@ class SecretRoleDetailView(generics.RetrieveAPIView):
Retrieve a single secret role
"""
queryset = SecretRole.objects.all()
serializer_class = SecretRoleSerializer
serializer_class = serializers.SecretRoleSerializer
class SecretListView(generics.GenericAPIView):
@ -42,7 +43,7 @@ class SecretListView(generics.GenericAPIView):
"""
queryset = Secret.objects.select_related('device__primary_ip', 'role')\
.prefetch_related('role__users', 'role__groups')
serializer_class = SecretSerializer
serializer_class = serializers.SecretSerializer
filter_class = SecretFilter
renderer_classes = [FormlessBrowsableAPIRenderer, JSONRenderer, FreeRADIUSClientsRenderer]
@ -87,7 +88,7 @@ class SecretDetailView(generics.GenericAPIView):
"""
queryset = Secret.objects.select_related('device__primary_ip', 'role')\
.prefetch_related('role__users', 'role__groups')
serializer_class = SecretSerializer
serializer_class = serializers.SecretSerializer
renderer_classes = [FormlessBrowsableAPIRenderer, JSONRenderer, FreeRADIUSClientsRenderer]
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 utilities.forms import BootstrapMixin, BulkImportForm, ConfirmationForm, CSVDataField
from .models import Secret, SecretRole, UserKey
@ -133,4 +134,3 @@ class UserKeyForm(forms.ModelForm, BootstrapMixin):
class ActivateUserKeyForm(forms.Form):
_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'}))

View File

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

View File

@ -5,7 +5,9 @@ from .models import SecretRole, Secret
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
urlpatterns = [
# 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 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 .filters import SecretFilter
from .forms import SecretRoleForm, SecretRoleBulkDeleteForm, SecretForm, SecretImportForm, SecretBulkEditForm,\
SecretBulkDeleteForm, SecretFilterForm
from .models import SecretRole, Secret, UserKey
from .tables import SecretRoleTable, SecretTable
#
@ -24,7 +21,7 @@ from .tables import SecretRoleTable, SecretTable
class SecretRoleListView(ObjectListView):
queryset = SecretRole.objects.annotate(secret_count=Count('secrets'))
table = SecretRoleTable
table = tables.SecretRoleTable
edit_permissions = ['secrets.change_secretrole', 'secrets.delete_secretrole']
template_name = 'secrets/secretrole_list.html'
@ -32,7 +29,7 @@ class SecretRoleListView(ObjectListView):
class SecretRoleEditView(PermissionRequiredMixin, ObjectEditView):
permission_required = 'secrets.change_secretrole'
model = SecretRole
form_class = SecretRoleForm
form_class = forms.SecretRoleForm
success_url = 'secrets:secretrole_list'
cancel_url = 'secrets:secretrole_list'
@ -40,7 +37,7 @@ class SecretRoleEditView(PermissionRequiredMixin, ObjectEditView):
class SecretRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'secrets.delete_secretrole'
cls = SecretRole
form = SecretRoleBulkDeleteForm
form = forms.SecretRoleBulkDeleteForm
default_redirect_url = 'secrets:secretrole_list'
@ -51,9 +48,9 @@ class SecretRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
@method_decorator(login_required, name='dispatch')
class SecretListView(ObjectListView):
queryset = Secret.objects.select_related('role').prefetch_related('device')
filter = SecretFilter
filter_form = SecretFilterForm
table = SecretTable
filter = filters.SecretFilter
filter_form = forms.SecretFilterForm
table = tables.SecretTable
edit_permissions = ['secrets.change_secret', 'secrets.delete_secret']
template_name = 'secrets/secret_list.html'
@ -79,7 +76,7 @@ def secret_add(request, pk):
uk = UserKey.objects.get(user=request.user)
if request.method == 'POST':
form = SecretForm(request.POST, instance=secret)
form = forms.SecretForm(request.POST, instance=secret)
if form.is_valid():
# 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)
else:
form = SecretForm(instance=secret)
form = forms.SecretForm(instance=secret)
return render(request, 'secrets/secret_edit.html', {
'secret': secret,
@ -118,7 +115,7 @@ def secret_edit(request, pk):
uk = UserKey.objects.get(user=request.user)
if request.method == 'POST':
form = SecretForm(request.POST, instance=secret)
form = forms.SecretForm(request.POST, instance=secret)
if form.is_valid():
# 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)
else:
form = SecretForm(instance=secret)
form = forms.SecretForm(instance=secret)
return render(request, 'secrets/secret_edit.html', {
'secret': secret,
@ -165,7 +162,7 @@ def secret_import(request):
uk = UserKey.objects.get(user=request.user)
if request.method == 'POST':
form = SecretImportForm(request.POST)
form = forms.SecretImportForm(request.POST)
if form.is_valid():
new_secrets = []
@ -183,7 +180,7 @@ def secret_import(request):
secret.save()
new_secrets.append(secret)
table = SecretTable(new_secrets)
table = tables.SecretTable(new_secrets)
messages.success(request, "Imported {} new secrets".format(len(new_secrets)))
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__))
else:
form = SecretImportForm()
form = forms.SecretImportForm()
return render(request, 'secrets/secret_import.html', {
'form': form,
@ -205,7 +202,7 @@ def secret_import(request):
class SecretBulkEditView(PermissionRequiredMixin, BulkEditView):
permission_required = 'secrets.change_secret'
cls = Secret
form = SecretBulkEditForm
form = forms.SecretBulkEditForm
template_name = 'secrets/secret_bulk_edit.html'
default_redirect_url = 'secrets:secret_list'
@ -223,5 +220,5 @@ class SecretBulkEditView(PermissionRequiredMixin, BulkEditView):
class SecretBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'secrets.delete_secret'
cls = Secret
form = SecretBulkDeleteForm
form = forms.SecretBulkDeleteForm
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
urlpatterns = [
# User profiles
url(r'^profile/$', views.profile, name='profile'),
url(r'^profile/password/$', views.change_password, name='change_password'),
url(r'^profile/user-key/$', views.userkey, name='userkey'),
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.models import UserKey
from .forms import LoginForm, PasswordChangeForm

View File

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

View File

@ -1,8 +1,10 @@
from django_tables2 import RequestConfig
from django.conf import settings
from django.contrib import messages
from django.contrib.admin.views.decorators import staff_member_required
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.models import ProtectedError
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.views.generic import View
from django_tables2 import RequestConfig
from extras.models import ExportTemplate
from .error_handlers import handle_protectederror
from .forms import ConfirmationForm
from .paginator import EnhancedPaginator
from extras.models import ExportTemplate
class ObjectListView(View):
@ -45,7 +46,8 @@ class ObjectListView(View):
filename='netbox_{}'.format(self.queryset.model._meta.verbose_name_plural))
return response
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
if self.redirect_on_single_result and self.queryset.count() == 1: