from django.contrib import admin, messages from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from orchestra.admin.utils import admin_link, admin_date, admin_colored, display_mono from . import settings, helpers from .backends import ServiceBackend from .models import Server, Route, BackendLog, BackendOperation from .widgets import RouteBackendSelect STATE_COLORS = { BackendLog.RECEIVED: 'darkorange', BackendLog.TIMEOUT: 'red', BackendLog.STARTED: 'blue', BackendLog.SUCCESS: 'green', BackendLog.FAILURE: 'red', BackendLog.ERROR: 'red', BackendLog.REVOKED: 'magenta', BackendLog.NOTHING: 'green', } class RouteAdmin(admin.ModelAdmin): list_display = ( 'backend', 'host', 'match', 'display_model', 'display_actions', 'async', 'is_active' ) list_editable = ('host', 'match', 'async', 'is_active') list_filter = ('host', 'is_active', 'async', 'backend') ordering = ('backend',) BACKEND_HELP_TEXT = helpers.get_backends_help_text(ServiceBackend.get_backends()) DEFAULT_MATCH = { backend.get_name(): backend.default_route_match for backend in ServiceBackend.get_backends() } def display_model(self, route): try: return escape(route.backend_class.model) except KeyError: return "NOT AVAILABLE" display_model.short_description = _("model") display_model.allow_tags = True def display_actions(self, route): try: return '
'.join(route.backend_class.get_actions()) except KeyError: return "NOT AVAILABLE" 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': 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, **kwargs) if obj: form.base_fields['backend'].help_text = self.BACKEND_HELP_TEXT.get(obj.backend, '') return form def show_orchestration_disabled(self, request): if settings.ORCHESTRATION_DISABLE_EXECUTION: msg = _("Orchestration execution is disabled by ORCHESTRATION_DISABLE_EXECUTION setting.") self.message_user(request, mark_safe(msg), messages.WARNING) def changelist_view(self, request, extra_context=None): self.show_orchestration_disabled(request) return super(RouteAdmin, self).changelist_view(request, extra_context) def changeform_view(self, request, object_id=None, form_url='', extra_context=None): self.show_orchestration_disabled(request) return super(RouteAdmin, self).changeform_view(request, object_id, form_url, extra_context) class BackendOperationInline(admin.TabularInline): model = BackendOperation fields = ('action', 'instance_link') readonly_fields = ('action', 'instance_link') extra = 0 can_delete = False class Media: css = { 'all': ('orchestra/css/hide-inline-id.css',) } def instance_link(self, operation): link = admin_link('instance')(self, operation) if not link.startswith('