from django import forms from django.contrib import admin from django.core.urlresolvers import reverse from django.utils.encoding import force_text from django.utils.translation import ugettext, ugettext_lazy as _ from orchestra.admin import ExtendedModelAdmin from orchestra.admin.utils import change_url, get_modeladmin from orchestra.contrib.accounts.admin import AccountAdminMixin from orchestra.forms.widgets import DynamicHelpTextSelect from orchestra.plugins.admin import SelectPluginAdminMixin from .filters import HasWebsiteListFilter from .models import WebApp, WebAppOption from .options import AppOption from .types import AppType class WebAppOptionInline(admin.TabularInline): model = WebAppOption extra = 1 OPTIONS_HELP_TEXT = { op.name: force_text(op.help_text) for op in AppOption.get_plugins() } class Media: css = { 'all': ('orchestra/css/hide-inline-id.css',) } def formfield_for_dbfield(self, db_field, **kwargs): if db_field.name == 'value': kwargs['widget'] = forms.TextInput(attrs={'size':'100'}) if db_field.name == 'name': if self.parent_object: plugin = self.parent_object.type_class else: request = kwargs['request'] webapp_modeladmin = get_modeladmin(self.parent_model) plugin_value = webapp_modeladmin.get_plugin_value(request) plugin = AppType.get(plugin_value) kwargs['choices'] = plugin.get_options_choices() # Help text based on select widget target = 'this.id.replace("name", "value")' kwargs['widget'] = DynamicHelpTextSelect(target, self.OPTIONS_HELP_TEXT) return super(WebAppOptionInline, self).formfield_for_dbfield(db_field, **kwargs) class WebAppAdmin(SelectPluginAdminMixin, AccountAdminMixin, ExtendedModelAdmin): list_display = ('name', 'type', 'display_detail', 'display_websites', 'account_link') list_filter = ('type', HasWebsiteListFilter) inlines = [WebAppOptionInline] readonly_fields = ('account_link', ) change_readonly_fields = ('name', 'type', 'display_websites') search_fields = ('name', 'account__username', 'data', 'website__domains__name') list_prefetch_related = ('content_set__website',) plugin = AppType plugin_field = 'type' plugin_title = _("Web application type") def display_websites(self, webapp): websites = [] for content in webapp.content_set.all(): website = content.website url = change_url(website) name = "%s on %s" % (website.name, content.path) websites.append('%s' % (url, name)) if not websites: add_url = reverse('admin:websites_website_add') add_url += '?account=%s' % webapp.account_id plus = '+' websites.append('%s%s' % (add_url, plus, ugettext("Add website"))) return '
'.join(websites) display_websites.short_description = _("web sites") display_websites.allow_tags = True def display_detail(self, webapp): return webapp.type_instance.get_detail() display_detail.short_description = _("detail") # def get_form(self, request, obj=None, **kwargs): # form = super(WebAppAdmin, self).get_form(request, obj, **kwargs) # if obj: # # def formfield_for_dbfield(self, db_field, **kwargs): # """ Make value input widget bigger """ # if db_field.name == 'type': # # Help text based on select widget # kwargs['widget'] = DynamicHelpTextSelect( # 'this.id.replace("name", "value")', self.TYPE_HELP_TEXT # ) # kwargs['help_text'] = self.TYPE_HELP_TEXT.get(db_field.default, '') # return super(WebAppAdmin, self).formfield_for_dbfield(db_field, **kwargs) admin.site.register(WebApp, WebAppAdmin)