From b481935b9aff6d14ed8ed0f93b7ef83e239420af Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 16 May 2016 12:07:12 -0400 Subject: [PATCH] Added CBVs for SecretRoles --- netbox/secrets/forms.py | 15 ++++++++ netbox/secrets/models.py | 3 ++ netbox/secrets/tables.py | 27 +++++++++++++- netbox/secrets/urls.py | 9 +++++ netbox/secrets/views.py | 36 ++++++++++++++++--- netbox/templates/_base.html | 5 +++ .../secrets/inc/secretrole_table.html | 14 ++++++++ netbox/templates/secrets/secretrole_list.html | 21 +++++++++++ 8 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 netbox/templates/secrets/inc/secretrole_table.html create mode 100644 netbox/templates/secrets/secretrole_list.html diff --git a/netbox/secrets/forms.py b/netbox/secrets/forms.py index 787ac7407..1b107d863 100644 --- a/netbox/secrets/forms.py +++ b/netbox/secrets/forms.py @@ -29,6 +29,21 @@ def validate_rsa_key(key, is_secret=True): raise forms.ValidationError("Error validating RSA key. Please ensure that your key supports PKCS#1 OAEP.") +# +# Secret roles +# + +class SecretRoleForm(forms.ModelForm, BootstrapMixin): + + class Meta: + model = SecretRole + fields = ['name', 'slug'] + + +class SecretRoleBulkDeleteForm(ConfirmationForm): + pk = forms.ModelMultipleChoiceField(queryset=SecretRole.objects.all(), widget=forms.MultipleHiddenInput) + + # # Secrets # diff --git a/netbox/secrets/models.py b/netbox/secrets/models.py index e9c49665d..cc6ab737f 100644 --- a/netbox/secrets/models.py +++ b/netbox/secrets/models.py @@ -173,6 +173,9 @@ class SecretRole(models.Model): def __unicode__(self): return self.name + def get_absolute_url(self): + return "{}?role={}".format(reverse('secrets:secret_list'), self.slug) + class Secret(models.Model): """ diff --git a/netbox/secrets/tables.py b/netbox/secrets/tables.py index ac9fc12bc..6c40c2e0e 100644 --- a/netbox/secrets/tables.py +++ b/netbox/secrets/tables.py @@ -1,7 +1,32 @@ import django_tables2 as tables from django_tables2.utils import Accessor -from .models import Secret +from .models import SecretRole, Secret + + +SECRETROLE_EDIT_LINK = """ +{% if perms.secrets.change_secretrole %}Edit{% endif %} +""" + + +# +# Secret roles +# + +class SecretRoleTable(tables.Table): + pk = tables.CheckBoxColumn(visible=False, default='') + name = tables.LinkColumn(verbose_name='Name') + secret_count = tables.Column(verbose_name='Secrets') + slug = tables.Column(verbose_name='Slug') + edit = tables.TemplateColumn(template_code=SECRETROLE_EDIT_LINK, verbose_name='') + + class Meta: + model = SecretRole + fields = ('pk', 'name', 'secret_count', 'slug', 'edit') + empty_text = "No secret roles were found." + attrs = { + 'class': 'table table-hover', + } # diff --git a/netbox/secrets/urls.py b/netbox/secrets/urls.py index 5f023499e..29daed109 100644 --- a/netbox/secrets/urls.py +++ b/netbox/secrets/urls.py @@ -3,6 +3,14 @@ from django.conf.urls import url from . import views urlpatterns = [ + + # Secret roles + url(r'^secret-roles/$', views.SecretRoleListView.as_view(), name='secretrole_list'), + url(r'^secret-roles/add/$', views.SecretRoleEditView.as_view(), name='secretrole_add'), + url(r'^secret-roles/delete/$', views.SecretRoleBulkDeleteView.as_view(), name='secretrole_bulk_delete'), + url(r'^secret-roles/(?P[\w-]+)/edit/$', views.SecretRoleEditView.as_view(), name='secretrole_edit'), + + # Secrets url(r'^secrets/$', views.SecretListView.as_view(), name='secret_list'), url(r'^secrets/import/$', views.secret_import, name='secret_import'), url(r'^secrets/edit/$', views.SecretBulkEditView.as_view(), name='secret_bulk_edit'), @@ -10,4 +18,5 @@ urlpatterns = [ url(r'^secrets/(?P\d+)/$', views.secret, name='secret'), url(r'^secrets/(?P\d+)/edit/$', views.secret_edit, name='secret_edit'), url(r'^secrets/(?P\d+)/delete/$', views.SecretDeleteView.as_view(), name='secret_delete'), + ] diff --git a/netbox/secrets/views.py b/netbox/secrets/views.py index 67e724f8b..c964f97ac 100644 --- a/netbox/secrets/views.py +++ b/netbox/secrets/views.py @@ -3,17 +3,45 @@ 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.utils.decorators import method_decorator from dcim.models import Device -from utilities.views import BulkEditView, BulkDeleteView, ObjectListView, ObjectDeleteView +from utilities.views import BulkEditView, BulkDeleteView, ObjectListView, ObjectEditView, ObjectDeleteView from .decorators import userkey_required from .filters import SecretFilter -from .forms import SecretForm, SecretImportForm, SecretBulkEditForm, SecretBulkDeleteForm, SecretFilterForm -from .models import Secret, UserKey -from .tables import SecretTable +from .forms import SecretRoleForm, SecretRoleBulkDeleteForm, SecretForm, SecretImportForm, SecretBulkEditForm,\ + SecretBulkDeleteForm, SecretFilterForm +from .models import SecretRole, Secret, UserKey +from .tables import SecretRoleTable, SecretTable + + +# +# Secret roles +# + +class SecretRoleListView(ObjectListView): + queryset = SecretRole.objects.annotate(secret_count=Count('secrets')) + table = SecretRoleTable + edit_permissions = ['secrets.change_secretrole', 'secrets.delete_secretrole'] + template_name = 'secrets/secretrole_list.html' + + +class SecretRoleEditView(PermissionRequiredMixin, ObjectEditView): + permission_required = 'secrets.change_secretrole' + model = SecretRole + form_class = SecretRoleForm + success_url = 'secrets:secretrole_list' + cancel_url = 'secrets:secretrole_list' + + +class SecretRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): + permission_required = 'secrets.delete_secretrole' + cls = SecretRole + form = SecretRoleBulkDeleteForm + default_redirect_url = 'secrets:secretrole_list' # diff --git a/netbox/templates/_base.html b/netbox/templates/_base.html index 5a3f9e2a1..46652e63c 100644 --- a/netbox/templates/_base.html +++ b/netbox/templates/_base.html @@ -180,6 +180,11 @@ {% if perms.secrets.add_secret %}
  • Import Secrets
  • {% endif %} +
  • +
  • Secret Roles
  • + {% if perms.secrets.add_secretrole %} +
  • Add a Secret Role
  • + {% endif %} {% endif %} diff --git a/netbox/templates/secrets/inc/secretrole_table.html b/netbox/templates/secrets/inc/secretrole_table.html new file mode 100644 index 000000000..6e110bda7 --- /dev/null +++ b/netbox/templates/secrets/inc/secretrole_table.html @@ -0,0 +1,14 @@ +{% load render_table from django_tables2 %} +{% if perms.secrets.delete_secretrole %} +
    + {% csrf_token %} + + {% render_table table table_template|default:'table.html' %} + +
    +{% else %} + {% render_table table table_template|default:'table.html' %} +{% endif %} diff --git a/netbox/templates/secrets/secretrole_list.html b/netbox/templates/secrets/secretrole_list.html new file mode 100644 index 000000000..62941fde0 --- /dev/null +++ b/netbox/templates/secrets/secretrole_list.html @@ -0,0 +1,21 @@ +{% extends '_base.html' %} +{% load helpers %} + +{% block title %}Secret Roles{% endblock %} + +{% block content %} +
    + {% if perms.dcim.add_devicerole %} + + + Add a secret role + + {% endif %} +
    +

    Device Roles

    +
    +
    + {% include 'secrets/inc/secretrole_table.html' %} +
    +
    +{% endblock %}