from django import forms from django.contrib import admin from django.utils.translation import ugettext, ugettext_lazy as _ from orchestra.admin import AtLeastOneRequiredInlineFormSet from orchestra.admin.utils import insertattr from orchestra.apps.accounts.admin import AccountAdmin, AccountAdminMixin from orchestra.forms.widgets import paddingCheckboxSelectMultiple from .filters import HasInvoiceContactListFilter from .models import Contact, InvoiceContact class ContactAdmin(AccountAdminMixin, admin.ModelAdmin): list_display = ( 'short_name', 'full_name', 'email', 'phone', 'phone2', 'country', 'account_link' ) list_filter = ('email_usage',) search_fields = ( 'contact__account__name', 'short_name', 'full_name', 'phone', 'phone2', 'email' ) fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('account_link', 'short_name', 'full_name') }), (_("Email"), { 'classes': ('wide',), 'fields': ('email', 'email_usage',) }), (_("Phone"), { 'classes': ('wide',), 'fields': ('phone', 'phone2'), }), (_("Postal address"), { 'classes': ('wide',), 'fields': ('address', ('zipcode', 'city'), 'country') }), ) add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('account', 'short_name', 'full_name') }), (_("Email"), { 'classes': ('wide',), 'fields': ('email', 'email_usage',) }), (_("Phone"), { 'classes': ('wide',), 'fields': ('phone', 'phone_alternative'), }), (_("Postal address"), { 'classes': ('wide',), 'fields': ('address', ('zip_code', 'city'), 'country') }), ) def formfield_for_dbfield(self, db_field, **kwargs): """ Make value input widget bigger """ if db_field.name == 'address': kwargs['widget'] = forms.Textarea(attrs={'cols': 70, 'rows': 2}) if db_field.name == 'email_usage': kwargs['widget'] = paddingCheckboxSelectMultiple(130) return super(ContactAdmin, self).formfield_for_dbfield(db_field, **kwargs) admin.site.register(Contact, ContactAdmin) class InvoiceContactInline(admin.StackedInline): model = InvoiceContact fields = ('name', 'address', ('city', 'zipcode'), 'country', 'vat') def formfield_for_dbfield(self, db_field, **kwargs): """ Make value input widget bigger """ 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(InvoiceContactInline, self).formfield_for_dbfield(db_field, **kwargs) class ContactInline(InvoiceContactInline): model = Contact formset = AtLeastOneRequiredInlineFormSet 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)