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' %} + + + Delete Selected + + +{% 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 %}