-
-
-
-
- {% render_table staged_change_table 'inc/table.html' %}
- {% include 'inc/paginator.html' with paginator=staged_change_table.paginator page=staged_change_table.page %}
-
-
- {% plugin_full_width_page object %}
+
+
+
+
+ {% render_table staged_change_table 'inc/table.html' %}
+ {% include 'inc/paginator.html' with paginator=staged_change_table.paginator page=staged_change_table.page %}
+
+ {% plugin_full_width_page object %}
+
{% endblock %}
\ No newline at end of file
diff --git a/netbox/templates/generic/object.html b/netbox/templates/generic/object.html
index 023726a30..6ffb942ec 100644
--- a/netbox/templates/generic/object.html
+++ b/netbox/templates/generic/object.html
@@ -66,6 +66,9 @@ Context:
{% if request.user|can_change:object %}
{% edit_button object %}
{% endif %}
+ {% if request.user|can_suggest:object %}
+ {% suggest_button object %}
+ {% endif %}
{% if request.user|can_delete:object %}
{% delete_button object %}
{% endif %}
diff --git a/netbox/utilities/templates/buttons/approve.html b/netbox/utilities/templates/buttons/approve.html
new file mode 100644
index 000000000..df86b5464
--- /dev/null
+++ b/netbox/utilities/templates/buttons/approve.html
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/netbox/utilities/templates/buttons/deny.html b/netbox/utilities/templates/buttons/deny.html
new file mode 100644
index 000000000..df0354b2c
--- /dev/null
+++ b/netbox/utilities/templates/buttons/deny.html
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/netbox/utilities/templates/buttons/suggest.html b/netbox/utilities/templates/buttons/suggest.html
new file mode 100644
index 000000000..a34752591
--- /dev/null
+++ b/netbox/utilities/templates/buttons/suggest.html
@@ -0,0 +1,3 @@
+
+ Suggest Change
+
diff --git a/netbox/utilities/templatetags/buttons.py b/netbox/utilities/templatetags/buttons.py
index bcdb099d8..07cf5f38a 100644
--- a/netbox/utilities/templatetags/buttons.py
+++ b/netbox/utilities/templatetags/buttons.py
@@ -36,6 +36,36 @@ def edit_button(instance):
}
+@register.inclusion_tag('buttons/suggest.html')
+def suggest_button(instance):
+ viewname = get_viewname(instance, 'suggest')
+ url = reverse(viewname, kwargs={'pk': instance.pk})
+
+ return {
+ 'url': url,
+ }
+
+
+@register.inclusion_tag('buttons/approve.html')
+def approve_button(instance):
+ viewname = get_viewname(instance, 'approve')
+ url = reverse(viewname, kwargs={'pk': instance.pk})
+
+ return {
+ 'url': url,
+ }
+
+
+@register.inclusion_tag('buttons/deny.html')
+def deny_button(instance):
+ viewname = get_viewname(instance, 'deny')
+ url = reverse(viewname, kwargs={'pk': instance.pk})
+
+ return {
+ 'url': url,
+ }
+
+
@register.inclusion_tag('buttons/delete.html')
def delete_button(instance):
viewname = get_viewname(instance, 'delete')
diff --git a/netbox/utilities/templatetags/perms.py b/netbox/utilities/templatetags/perms.py
index f1bbf7549..02fcff620 100644
--- a/netbox/utilities/templatetags/perms.py
+++ b/netbox/utilities/templatetags/perms.py
@@ -1,4 +1,7 @@
from django import template
+from django.urls import NoReverseMatch, reverse
+from utilities.utils import get_viewname
+
register = template.Library()
@@ -10,6 +13,15 @@ def _check_permission(user, instance, action):
)
+def _check_view_exists(instance):
+ try:
+ viewname = get_viewname(instance, 'suggest')
+ reverse(viewname, kwargs={'pk': instance.pk})
+ return True
+ except NoReverseMatch:
+ return False
+
+
@register.filter()
def can_view(user, instance):
return _check_permission(user, instance, 'view')
@@ -25,6 +37,22 @@ def can_change(user, instance):
return _check_permission(user, instance, 'change')
+@register.filter()
+def can_suggest(user, instance):
+ # TODO: View check is temporary until we impl. this everywhere.
+ return _check_view_exists(instance) and _check_permission(user, instance, 'suggest')
+
+
+@register.filter()
+def is_owner(user, instance):
+ return instance.owner.id == user.id
+
+
+@register.filter()
+def is_reviewer(user, instance):
+ return instance.reviewer.id == user.id
+
+
@register.filter()
def can_delete(user, instance):
return _check_permission(user, instance, 'delete')