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

68 lines
2.2 KiB
Python

from django import forms
from django.contrib import admin
from orchestra.admin import AtLeastOneRequiredInlineFormSet
from orchestra.admin.utils import insertattr
from orchestra.apps.accounts.admin import AccountAdmin, AccountAdminMixin
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__user__username', 'short_name', 'full_name', 'phone', 'phone2',
'email'
)
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})
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.get()
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)
for field in ('contacts__short_name', 'contacts__full_name', 'contacts__phone',
'contacts__phone2', 'contacts__email'):
insertattr(AccountAdmin, 'search_fields', field)