def insert_resource_inlines(): # Clean previous state for related in Resource._related: modeladmin = get_modeladmin(related) modeladmin_class = type(modeladmin) for inline in getattr(modeladmin_class, 'inlines', []): if inline.__name__ == 'ResourceInline': modeladmin_class.inlines.remove(inline) resources = Resource.objects.filter(is_active=True) for ct, resources in resources.group_by('content_type').items(): inline = resource_inline_factory(resources) model = ct.model_class() insertattr(model, 'inlines', inline)
admin.site.register(Fee, BillAdmin) admin.site.register(AmendmentFee, BillAdmin) admin.site.register(ProForma, BillAdmin) admin.site.register(BillLine, BillLineAdmin) class BillContactInline(admin.StackedInline): model = BillContact fields = ('name', 'address', ('city', 'zipcode'), 'country', 'vat') def formfield_for_dbfield(self, db_field, **kwargs): """ Make value input widget bigger """ if db_field.name == 'name': kwargs['widget'] = forms.TextInput(attrs={'size':'70'}) if db_field.name == 'address': kwargs['widget'] = forms.Textarea(attrs={'cols': 70, 'rows': 2}) if db_field.name == 'email_usage': kwargs['widget'] = paddingCheckboxSelectMultiple(45) return super(BillContactInline, self).formfield_for_dbfield(db_field, **kwargs) def has_bill_contact(account): return hasattr(account, 'billcontact') has_bill_contact.boolean = True has_bill_contact.admin_order_field = 'billcontact' insertattr(AccountAdmin, 'inlines', BillContactInline) insertattr(AccountAdmin, 'list_display', has_bill_contact) insertattr(AccountAdmin, 'list_filter', HasBillContactListFilter)
extra = 0 fields = ( 'short_name', 'full_name', 'email', 'email_usage', ('phone', 'phone2'), 'address', ('city', 'zipcode'), 'country', ) def get_extra(self, request, obj=None, **kwargs): return 0 if obj and obj.contacts.exists() else 1 def has_invoice(account): try: account.invoicecontact except InvoiceContact.DoesNotExist: return False return True has_invoice.boolean = True has_invoice.admin_order_field = 'invoicecontact' insertattr(AccountAdmin, 'inlines', ContactInline) insertattr(AccountAdmin, 'inlines', InvoiceContactInline) insertattr(AccountAdmin, 'list_display', has_invoice) insertattr(AccountAdmin, 'list_filter', HasInvoiceContactListFilter) search_fields = ( 'contacts__short_name', 'contacts__full_name', 'contacts__phone', 'contacts__phone2', 'contacts__email' ) for field in search_fields: insertattr(AccountAdmin, 'search_fields', field)
admin.site.register(ProForma, BillAdmin) admin.site.register(BillLine, BillLineAdmin) class BillContactInline(admin.StackedInline): model = BillContact fields = ('name', 'address', ('city', 'zipcode'), 'country', 'vat') def formfield_for_dbfield(self, db_field, **kwargs): """ Make value input widget bigger """ if db_field.name == 'name': kwargs['widget'] = forms.TextInput(attrs={'size': '90'}) if db_field.name == 'address': kwargs['widget'] = forms.Textarea(attrs={'cols': 70, 'rows': 2}) if db_field.name == 'email_usage': kwargs['widget'] = paddingCheckboxSelectMultiple(45) return super().formfield_for_dbfield(db_field, **kwargs) def has_bill_contact(account): return hasattr(account, 'billcontact') has_bill_contact.boolean = True has_bill_contact.admin_order_field = 'billcontact' insertattr(AccountAdmin, 'inlines', BillContactInline) insertattr(AccountAdmin, 'list_display', has_bill_contact) insertattr(AccountAdmin, 'list_filter', HasBillContactListFilter) insertattr(AccountAdmin, 'list_select_related', 'billcontact')
from django.contrib import admin from orchestra.admin.utils import insertattr from .models import WebDatabase from ..models import Web class WebDatabaseInline(admin.TabularInline): model = WebDatabase insertattr(Web, 'inlines', WebDatabaseInline)
'email_usage', ('phone', 'phone2'), ) def get_extra(self, request, obj=None, **kwargs): return 0 if obj and obj.contacts.exists() else 1 def get_view_on_site_url(self, obj=None): if obj: return change_url(obj) def formfield_for_dbfield(self, db_field, **kwargs): """ Make value input widget bigger """ if db_field.name == 'short_name': kwargs['widget'] = forms.TextInput(attrs={'size': '15'}) if db_field.name == 'address': kwargs['widget'] = forms.Textarea(attrs={'cols': 70, 'rows': 2}) if db_field.name == 'email_usage': kwargs['widget'] = paddingCheckboxSelectMultiple(45) return super(ContactInline, self).formfield_for_dbfield(db_field, **kwargs) insertattr(AccountAdmin, 'inlines', ContactInline) search_fields = ( 'contacts__short_name', 'contacts__full_name', ) for field in search_fields: insertattr(AccountAdmin, 'search_fields', field)
def display_forward(self, address): values = [ dest for dest in address.forward.split() ] return '<br>'.join(values) display_forward.short_description = _("Forward") display_forward.allow_tags = True def formfield_for_dbfield(self, db_field, **kwargs): if db_field.name == 'forward': kwargs['widget'] = forms.TextInput(attrs={'size':'118'}) if db_field.name == 'mailboxes': mailboxes = db_field.rel.to.objects.select_related('user') kwargs['queryset'] = mailboxes.filter(user__account=self.account) return super(AddressAdmin, self).formfield_for_dbfield(db_field, **kwargs) def get_queryset(self, request): """ Select related for performance """ qs = super(AddressAdmin, self).get_queryset(request) return qs.select_related('domain') class MailRoleAdmin(RoleAdmin): model = Mailbox name = 'mailbox' url_name = 'mailbox' form = MailRoleAdminForm admin.site.register(Address, AddressAdmin) insertattr(get_user_model(), 'roles', MailRoleAdmin)
class ResourceInline(generic.GenericTabularInline): model = ResourceData verbose_name_plural = _("resources") form = ResourceForm formset = ResourceInlineFormSet can_delete = False fields = ( 'verbose_name', 'used', 'display_last_update', 'allocated', 'unit' ) readonly_fields = ('used', 'display_last_update') class Media: css = { 'all': ('orchestra/css/hide-inline-id.css',) } display_last_update = admin_date('last_update', default=_("Never")) def has_add_permission(self, *args, **kwargs): """ Hidde add another """ return False return ResourceInline if not running_syncdb(): # not run during syncdb for ct, resources in Resource.objects.group_by('content_type'): inline = resource_inline_factory(resources) model = ct.model_class() insertattr(model, 'inlines', inline)
from orchestra.admin.utils import insertattr from orchestra.contrib.websites.admin import WebsiteAdmin from . import actions insertattr(WebsiteAdmin, 'change_view_actions', actions.letsencrypt) insertattr(WebsiteAdmin, 'actions', actions.letsencrypt)
change_readonly_fields = ('name',) inlines = [RateInline] def num_contracts(self, plan): num = plan.contracts__count url = reverse('admin:plans_contractedplan_changelist') url += '?plan__name={}'.format(plan.name) return format_html('<a href="{0}">{1}</a>', url, num) num_contracts.short_description = _("Contracts") num_contracts.admin_order_field = 'contracts__count' def get_queryset(self, request): qs = super(PlanAdmin, self).get_queryset(request) return qs.annotate(models.Count('contracts', distinct=True)) class ContractedPlanAdmin(AccountAdminMixin, admin.ModelAdmin): list_display = ('id', 'plan_link', 'account_link') list_filter = ('plan__name',) list_select_related = ('plan', 'account') search_fields = ('account__username', 'plan__name', 'id') actions = (list_accounts,) plan_link = admin_link('plan') admin.site.register(Plan, PlanAdmin) admin.site.register(ContractedPlan, ContractedPlanAdmin) insertattr(Service, 'inlines', RateInline)
def num_contracts(self, plan): num = plan.contracts__count url = reverse("admin:plans_contractedplan_changelist") url += "?plan__name={}".format(plan.name) return '<a href="{0}">{1}</a>'.format(url, num) num_contracts.short_description = _("Contracts") num_contracts.admin_order_field = "contracts__count" num_contracts.allow_tags = True def get_queryset(self, request): qs = super(PlanAdmin, self).get_queryset(request) return qs.annotate(models.Count("contracts", distinct=True)) class ContractedPlanAdmin(AccountAdminMixin, admin.ModelAdmin): list_display = ("id", "plan_link", "account_link") list_filter = ("plan__name",) list_select_related = ("plan", "account") search_fields = ("account__username", "plan__name", "id") actions = (list_accounts,) plan_link = admin_link("plan") admin.site.register(Plan, PlanAdmin) admin.site.register(ContractedPlan, ContractedPlanAdmin) insertattr(Service, "inlines", RateInline)
from django.contrib import admin from django.contrib.auth import get_user_model from django.utils.translation import ugettext_lazy as _ from orchestra.admin.utils import insertattr from orchestra.apps.users.roles.admin import RoleAdmin from .models import Jabber class JabberRoleAdmin(RoleAdmin): model = Jabber name = 'jabber' url_name = 'jabber' insertattr(get_user_model(), 'roles', JabberRoleAdmin)
from .models import Plan, ContractedPlan, Rate class RateInline(admin.TabularInline): model = Rate ordering = ('service', 'plan', 'quantity') class PlanAdmin(ExtendedModelAdmin): list_display = ('name', 'is_default', 'is_combinable', 'allow_multiple', 'is_active') list_filter = ('is_default', 'is_combinable', 'allow_multiple', 'is_active') fields = ('verbose_name', 'name', 'is_default', 'is_combinable', 'allow_multiple') prepopulated_fields = { 'name': ('verbose_name',) } change_readonly_fields = ('name',) inlines = [RateInline] class ContractedPlanAdmin(AccountAdminMixin, admin.ModelAdmin): list_display = ('plan', 'account_link') list_filter = ('plan__name',) list_select_related = ('plan', 'account') admin.site.register(Plan, PlanAdmin) admin.site.register(ContractedPlan, ContractedPlanAdmin) insertattr(Service, 'inlines', RateInline)
from orchestra.admin.utils import insertattr from orchestra.contrib.websites.admin import WebsiteAdmin from .import actions insertattr(WebsiteAdmin, 'change_view_actions', actions.letsencrypt) insertattr(WebsiteAdmin, 'actions', actions.letsencrypt)
formset = AtLeastOneRequiredInlineFormSet extra = 0 fields = ( ('short_name', 'full_name'), 'email', 'email_usage', ('phone', 'phone2'), ) def get_extra(self, request, obj=None, **kwargs): return 0 if obj and obj.contacts.exists() else 1 def get_view_on_site_url(self, obj=None): if obj: return change_url(obj) def formfield_for_dbfield(self, db_field, **kwargs): """ Make value input widget bigger """ if db_field.name == 'short_name': kwargs['widget'] = forms.TextInput(attrs={'size':'15'}) if db_field.name == 'address': kwargs['widget'] = forms.Textarea(attrs={'cols': 70, 'rows': 2}) if db_field.name == 'email_usage': kwargs['widget'] = paddingCheckboxSelectMultiple(45) return super(ContactInline, self).formfield_for_dbfield(db_field, **kwargs) insertattr(AccountAdmin, 'inlines', ContactInline) search_fields = ( 'contacts__short_name', 'contacts__full_name', ) for field in search_fields: insertattr(AccountAdmin, 'search_fields', field)
from django.contrib import admin from orchestra.admin.utils import insertattr from .models import WebFTPAccount from ..models import Web class WebFTPAccountInline(admin.TabularInline): model = WebFTPAccount insertattr(Web, 'inlines', WebFTPAccountInline)