2017-05-24 11:33:11 -04:00
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
2016-08-15 16:58:25 -04:00
|
|
|
from django import forms
|
2016-03-01 11:23:03 -05:00
|
|
|
from django.contrib import admin
|
2016-12-06 13:16:42 -05:00
|
|
|
from django.utils.safestring import mark_safe
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2018-05-30 11:19:10 -04:00
|
|
|
from utilities.forms import LaxURLField
|
2018-06-13 17:06:33 -04:00
|
|
|
from .constants import OBJECTCHANGE_ACTION_CREATE, OBJECTCHANGE_ACTION_DELETE, OBJECTCHANGE_ACTION_UPDATE
|
2018-05-30 11:19:10 -04:00
|
|
|
from .models import (
|
2018-06-27 16:02:34 -04:00
|
|
|
ConfigContext, CustomField, CustomFieldChoice, Graph, ExportTemplate, ObjectChange, TopologyMap, UserAction,
|
|
|
|
Webhook,
|
2018-05-30 11:19:10 -04:00
|
|
|
)
|
2016-08-15 16:58:25 -04:00
|
|
|
|
|
|
|
|
2017-09-19 11:31:29 -04:00
|
|
|
def order_content_types(field):
|
|
|
|
"""
|
|
|
|
Order the list of available ContentTypes by application
|
|
|
|
"""
|
|
|
|
queryset = field.queryset.order_by('app_label', 'model')
|
|
|
|
field.choices = [(ct.pk, '{} > {}'.format(ct.app_label, ct.name)) for ct in queryset]
|
|
|
|
|
|
|
|
|
2018-05-30 11:19:10 -04:00
|
|
|
#
|
|
|
|
# Webhooks
|
|
|
|
#
|
|
|
|
|
|
|
|
class WebhookForm(forms.ModelForm):
|
|
|
|
|
|
|
|
payload_url = LaxURLField()
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = Webhook
|
|
|
|
exclude = []
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super(WebhookForm, self).__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
order_content_types(self.fields['obj_type'])
|
|
|
|
|
|
|
|
|
|
|
|
@admin.register(Webhook)
|
|
|
|
class WebhookAdmin(admin.ModelAdmin):
|
|
|
|
list_display = [
|
|
|
|
'name', 'models', 'payload_url', 'http_content_type', 'enabled', 'type_create', 'type_update',
|
|
|
|
'type_delete', 'ssl_verification',
|
|
|
|
]
|
|
|
|
form = WebhookForm
|
|
|
|
|
|
|
|
def models(self, obj):
|
|
|
|
return ', '.join([ct.name for ct in obj.obj_type.all()])
|
|
|
|
|
|
|
|
|
2017-09-19 11:31:29 -04:00
|
|
|
#
|
|
|
|
# Custom fields
|
|
|
|
#
|
|
|
|
|
2016-08-15 16:58:25 -04:00
|
|
|
class CustomFieldForm(forms.ModelForm):
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = CustomField
|
|
|
|
exclude = []
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super(CustomFieldForm, self).__init__(*args, **kwargs)
|
|
|
|
|
2017-09-19 11:31:29 -04:00
|
|
|
order_content_types(self.fields['obj_type'])
|
2016-08-12 17:20:01 -04:00
|
|
|
|
|
|
|
|
|
|
|
class CustomFieldChoiceAdmin(admin.TabularInline):
|
|
|
|
model = CustomFieldChoice
|
2016-08-18 14:23:28 -04:00
|
|
|
extra = 5
|
2016-08-12 17:20:01 -04:00
|
|
|
|
|
|
|
|
|
|
|
@admin.register(CustomField)
|
|
|
|
class CustomFieldAdmin(admin.ModelAdmin):
|
|
|
|
inlines = [CustomFieldChoiceAdmin]
|
2018-02-21 15:40:11 -05:00
|
|
|
list_display = ['name', 'models', 'type', 'required', 'filter_logic', 'default', 'weight', 'description']
|
2016-08-15 16:58:25 -04:00
|
|
|
form = CustomFieldForm
|
2016-08-15 15:24:23 -04:00
|
|
|
|
|
|
|
def models(self, obj):
|
|
|
|
return ', '.join([ct.name for ct in obj.obj_type.all()])
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2017-09-19 11:31:29 -04:00
|
|
|
#
|
|
|
|
# Graphs
|
|
|
|
#
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
@admin.register(Graph)
|
|
|
|
class GraphAdmin(admin.ModelAdmin):
|
|
|
|
list_display = ['name', 'type', 'weight', 'source']
|
|
|
|
|
|
|
|
|
2017-09-19 11:31:29 -04:00
|
|
|
#
|
|
|
|
# Export templates
|
|
|
|
#
|
|
|
|
|
|
|
|
class ExportTemplateForm(forms.ModelForm):
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = ExportTemplate
|
|
|
|
exclude = []
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super(ExportTemplateForm, self).__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
# Format ContentType choices
|
|
|
|
order_content_types(self.fields['content_type'])
|
|
|
|
self.fields['content_type'].choices.insert(0, ('', '---------'))
|
|
|
|
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
@admin.register(ExportTemplate)
|
|
|
|
class ExportTemplateAdmin(admin.ModelAdmin):
|
2016-09-27 16:31:18 -04:00
|
|
|
list_display = ['name', 'content_type', 'description', 'mime_type', 'file_extension']
|
2017-09-19 11:31:29 -04:00
|
|
|
form = ExportTemplateForm
|
|
|
|
|
2016-04-08 14:57:54 -04:00
|
|
|
|
2017-09-19 11:31:29 -04:00
|
|
|
#
|
|
|
|
# Topology maps
|
|
|
|
#
|
2016-04-08 14:57:54 -04:00
|
|
|
|
|
|
|
@admin.register(TopologyMap)
|
|
|
|
class TopologyMapAdmin(admin.ModelAdmin):
|
|
|
|
list_display = ['name', 'slug', 'site']
|
|
|
|
prepopulated_fields = {
|
|
|
|
'slug': ['name'],
|
|
|
|
}
|
2016-08-06 15:35:13 -04:00
|
|
|
|
|
|
|
|
2018-06-27 16:02:34 -04:00
|
|
|
#
|
|
|
|
# Config contexts
|
|
|
|
#
|
|
|
|
|
|
|
|
@admin.register(ConfigContext)
|
|
|
|
class ConfigContextAdmin(admin.ModelAdmin):
|
|
|
|
list_display = ['name', 'weight']
|
|
|
|
|
|
|
|
|
2018-06-13 17:06:33 -04:00
|
|
|
#
|
|
|
|
# Change logging
|
|
|
|
#
|
|
|
|
|
|
|
|
@admin.register(ObjectChange)
|
|
|
|
class ObjectChangeAdmin(admin.ModelAdmin):
|
|
|
|
actions = None
|
2018-06-22 15:05:40 -04:00
|
|
|
fields = ['time', 'changed_object_type', 'display_object', 'action', 'display_user', 'request_id', 'object_data']
|
|
|
|
list_display = ['time', 'changed_object_type', 'display_object', 'display_action', 'display_user', 'request_id']
|
2018-06-13 17:06:33 -04:00
|
|
|
list_filter = ['time', 'action', 'user__username']
|
2018-06-22 15:05:40 -04:00
|
|
|
list_select_related = ['changed_object_type', 'user']
|
2018-06-13 17:06:33 -04:00
|
|
|
readonly_fields = fields
|
2018-06-19 15:45:15 -04:00
|
|
|
search_fields = ['user_name', 'object_repr', 'request_id']
|
2018-06-13 17:06:33 -04:00
|
|
|
|
|
|
|
def has_add_permission(self, request):
|
|
|
|
return False
|
|
|
|
|
|
|
|
def display_user(self, obj):
|
|
|
|
if obj.user is not None:
|
|
|
|
return obj.user
|
|
|
|
else:
|
|
|
|
return '{} (deleted)'.format(obj.user_name)
|
|
|
|
display_user.short_description = 'user'
|
|
|
|
|
|
|
|
def display_action(self, obj):
|
|
|
|
icon = {
|
|
|
|
OBJECTCHANGE_ACTION_CREATE: 'addlink',
|
|
|
|
OBJECTCHANGE_ACTION_UPDATE: 'changelink',
|
|
|
|
OBJECTCHANGE_ACTION_DELETE: 'deletelink',
|
|
|
|
}
|
|
|
|
return mark_safe('<span class="{}">{}</span>'.format(icon[obj.action], obj.get_action_display()))
|
2018-06-14 16:15:14 -04:00
|
|
|
display_action.short_description = 'action'
|
2018-06-13 17:06:33 -04:00
|
|
|
|
|
|
|
def display_object(self, obj):
|
|
|
|
if hasattr(obj.changed_object, 'get_absolute_url'):
|
|
|
|
return mark_safe('<a href="{}">{}</a>'.format(obj.changed_object.get_absolute_url(), obj.changed_object))
|
|
|
|
elif obj.changed_object is not None:
|
|
|
|
return obj.changed_object
|
|
|
|
else:
|
|
|
|
return '{} (deleted)'.format(obj.object_repr)
|
|
|
|
display_object.short_description = 'object'
|
|
|
|
|
|
|
|
|
2017-09-19 11:31:29 -04:00
|
|
|
#
|
|
|
|
# User actions
|
|
|
|
#
|
|
|
|
|
2016-08-06 15:35:13 -04:00
|
|
|
@admin.register(UserAction)
|
|
|
|
class UserActionAdmin(admin.ModelAdmin):
|
|
|
|
actions = None
|
2016-12-06 13:16:42 -05:00
|
|
|
list_display = ['user', 'action', 'content_type', 'object_id', '_message']
|
|
|
|
|
|
|
|
def _message(self, obj):
|
|
|
|
return mark_safe(obj.message)
|