django-orchestra/orchestra/apps/orchestration/admin.py

148 lines
5 KiB
Python
Raw Normal View History

from django import forms
2014-05-08 16:59:35 +00:00
from django.contrib import admin
from django.utils.html import escape
from django.utils.translation import ugettext_lazy as _
from orchestra.admin.html import monospace_format
2014-07-24 09:53:34 +00:00
from orchestra.admin.utils import admin_link, admin_date, admin_colored
2014-05-08 16:59:35 +00:00
from .backends import ServiceBackend
2014-05-08 16:59:35 +00:00
from .models import Server, Route, BackendLog, BackendOperation
2015-03-04 21:06:16 +00:00
from .widgets import RouteBackendSelect
2014-05-08 16:59:35 +00:00
2015-03-10 21:51:10 +00:00
2014-05-08 16:59:35 +00:00
STATE_COLORS = {
BackendLog.RECEIVED: 'darkorange',
BackendLog.TIMEOUT: 'red',
BackendLog.STARTED: 'blue',
BackendLog.SUCCESS: 'green',
BackendLog.FAILURE: 'red',
BackendLog.ERROR: 'red',
BackendLog.REVOKED: 'magenta',
}
2015-03-04 21:06:16 +00:00
2014-05-08 16:59:35 +00:00
class RouteAdmin(admin.ModelAdmin):
list_display = [
2015-03-12 14:05:23 +00:00
'backend', 'host', 'match', 'display_model', 'display_actions', 'is_active'
2014-05-08 16:59:35 +00:00
]
2015-03-04 21:06:16 +00:00
list_editable = ['host', 'match', 'is_active']
2014-07-09 16:17:43 +00:00
list_filter = ['host', 'is_active', 'backend']
2014-05-08 16:59:35 +00:00
BACKEND_HELP_TEXT = {
backend: "This backend operates over '%s'" % ServiceBackend.get_backend(backend).model
for backend, __ in ServiceBackend.get_plugin_choices()
}
2015-03-04 21:06:16 +00:00
DEFAULT_MATCH = {
backend.get_name(): backend.default_route_match for backend in ServiceBackend.get_backends(active=False)
}
2014-05-08 16:59:35 +00:00
def display_model(self, route):
try:
2014-07-14 14:56:48 +00:00
return escape(route.backend_class().model)
2014-05-08 16:59:35 +00:00
except KeyError:
return "<span style='color: red;'>NOT AVAILABLE</span>"
display_model.short_description = _("model")
display_model.allow_tags = True
2014-07-09 16:17:43 +00:00
def display_actions(self, route):
try:
2014-07-10 10:03:22 +00:00
return '<br>'.join(route.backend_class().get_actions())
2014-07-09 16:17:43 +00:00
except KeyError:
return "<span style='color: red;'>NOT AVAILABLE</span>"
display_actions.short_description = _("actions")
display_actions.allow_tags = True
def formfield_for_dbfield(self, db_field, **kwargs):
""" Provides dynamic help text on backend form field """
if db_field.name == 'backend':
2015-03-04 21:06:16 +00:00
kwargs['widget'] = RouteBackendSelect('this.id', self.BACKEND_HELP_TEXT, self.DEFAULT_MATCH)
return super(RouteAdmin, self).formfield_for_dbfield(db_field, **kwargs)
def get_form(self, request, obj=None, **kwargs):
""" Include dynamic help text for existing objects """
form = super(RouteAdmin, self).get_form(request, obj=obj, **kwargs)
if obj:
2015-03-12 14:05:23 +00:00
form.base_fields['backend'].help_text = self.BACKEND_HELP_TEXT.get(obj.backend, '')
return form
2014-05-08 16:59:35 +00:00
class BackendOperationInline(admin.TabularInline):
model = BackendOperation
2014-10-10 17:17:20 +00:00
fields = ('action', 'instance_link')
readonly_fields = ('action', 'instance_link')
2014-05-08 16:59:35 +00:00
extra = 0
can_delete = False
class Media:
css = {
'all': ('orchestra/css/hide-inline-id.css',)
}
2014-10-10 17:17:20 +00:00
def instance_link(self, operation):
2014-05-08 16:59:35 +00:00
try:
2014-10-10 17:17:20 +00:00
return admin_link('instance')(self, operation)
2014-05-08 16:59:35 +00:00
except:
2014-07-14 14:56:48 +00:00
return _("deleted {0} {1}").format(
escape(operation.content_type), escape(operation.object_id)
)
2014-10-10 17:17:20 +00:00
instance_link.allow_tags = True
instance_link.short_description = _("Instance")
2014-05-08 16:59:35 +00:00
def has_add_permission(self, *args, **kwargs):
return False
2014-09-10 16:53:09 +00:00
def get_queryset(self, request):
queryset = super(BackendOperationInline, self).get_queryset(request)
2014-10-10 17:17:20 +00:00
return queryset.prefetch_related('instance')
2014-05-08 16:59:35 +00:00
def display_mono(field):
def display(self, log):
return monospace_format(escape(getattr(log, field)))
display.short_description = _(field)
return display
2014-05-08 16:59:35 +00:00
class BackendLogAdmin(admin.ModelAdmin):
list_display = (
2014-07-14 14:56:48 +00:00
'id', 'backend', 'server_link', 'display_state', 'exit_code',
'display_created', 'execution_time',
2014-05-08 16:59:35 +00:00
)
list_display_links = ('id', 'backend')
list_filter = ('state', 'backend')
inlines = [BackendOperationInline]
fields = [
2014-07-25 15:17:50 +00:00
'backend', 'server_link', 'state', 'mono_script', 'mono_stdout',
'mono_stderr', 'mono_traceback', 'exit_code', 'task_id', 'display_created',
'execution_time'
2014-05-08 16:59:35 +00:00
]
2014-07-14 14:56:48 +00:00
readonly_fields = fields
2014-05-08 16:59:35 +00:00
2014-07-21 15:43:36 +00:00
server_link = admin_link('server')
display_created = admin_date('created_at', short_description=_("Created"))
2014-07-24 09:53:34 +00:00
display_state = admin_colored('state', colors=STATE_COLORS)
mono_script = display_mono('script')
mono_stdout = display_mono('stdout')
mono_stderr = display_mono('stderr')
mono_traceback = display_mono('traceback')
2014-05-08 16:59:35 +00:00
2014-07-08 15:19:15 +00:00
def get_queryset(self, request):
2014-05-08 16:59:35 +00:00
""" Order by structured name and imporve performance """
2014-07-08 15:19:15 +00:00
qs = super(BackendLogAdmin, self).get_queryset(request)
2014-09-10 16:53:09 +00:00
return qs.select_related('server').defer('script', 'stdout')
2014-09-26 15:05:20 +00:00
def has_add_permission(self, *args, **kwargs):
return False
2014-05-08 16:59:35 +00:00
class ServerAdmin(admin.ModelAdmin):
list_display = ('name', 'address', 'os')
list_filter = ('os',)
admin.site.register(Server, ServerAdmin)
admin.site.register(BackendLog, BackendLogAdmin)
admin.site.register(Route, RouteAdmin)