Show forwards on mailboxes change view
This commit is contained in:
parent
72ed0c3062
commit
51ac729ce1
2
TODO.md
2
TODO.md
|
@ -454,5 +454,3 @@ mkhomedir_helper or create ssh homes with bash.rc and such
|
|||
# exclude from change list action, support for multiple exclusion
|
||||
|
||||
# breadcrumbs https://orchestra.pangea.org/admin/domains/domain/?account_id=930
|
||||
|
||||
# SHow addresses on mailboxes (+add address)
|
||||
|
|
|
@ -66,10 +66,10 @@ class MailboxAdmin(ChangePasswordAdminMixin, SelectAccountAdminMixin, ExtendedMo
|
|||
'fields': ('custom_filtering',),
|
||||
}),
|
||||
(_("Addresses"), {
|
||||
'fields': ('addresses',)
|
||||
'fields': ('addresses', 'display_forwards')
|
||||
}),
|
||||
)
|
||||
readonly_fields = ('account_link', 'display_addresses')
|
||||
readonly_fields = ('account_link', 'display_addresses', 'display_forwards')
|
||||
change_readonly_fields = ('name',)
|
||||
add_form = MailboxCreationForm
|
||||
form = MailboxChangeForm
|
||||
|
@ -90,6 +90,15 @@ class MailboxAdmin(ChangePasswordAdminMixin, SelectAccountAdminMixin, ExtendedMo
|
|||
display_addresses.short_description = _("Addresses")
|
||||
display_addresses.allow_tags = True
|
||||
|
||||
def display_forwards(self, mailbox):
|
||||
forwards = []
|
||||
for addr in mailbox.get_forwards():
|
||||
url = change_url(addr)
|
||||
forwards.append('<a href="%s">%s</a>' % (url, addr.email))
|
||||
return '<br>'.join(forwards)
|
||||
display_forwards.short_description = _("Forwards")
|
||||
display_forwards.allow_tags = True
|
||||
|
||||
def display_filtering(self, mailbox):
|
||||
""" becacuse of allow_tags = True """
|
||||
return mailbox.get_filtering_display()
|
||||
|
@ -133,10 +142,10 @@ class MailboxAdmin(ChangePasswordAdminMixin, SelectAccountAdminMixin, ExtendedMo
|
|||
return super(MailboxAdmin, self).render_change_form(
|
||||
request, context, add, change, form_url, obj)
|
||||
|
||||
def log_addition(self, request, object):
|
||||
def log_addition(self, request, object, *args, **kwargs):
|
||||
self.check_unrelated_address(request, object)
|
||||
self.check_matching_address(request, object)
|
||||
return super(MailboxAdmin, self).log_addition(request, object)
|
||||
return super(MailboxAdmin, self).log_addition(request, object, *args, **kwargs)
|
||||
|
||||
def check_matching_address(self, request, obj):
|
||||
local_domain = settings.MAILBOXES_LOCAL_DOMAIN
|
||||
|
@ -267,9 +276,9 @@ class AddressAdmin(SelectAccountAdminMixin, ExtendedModelAdmin):
|
|||
return super(AddressAdmin, self).render_change_form(
|
||||
request, context, add, change, form_url, obj)
|
||||
|
||||
def log_addition(self, request, object):
|
||||
def log_addition(self, request, object, *args, **kwargs):
|
||||
self.check_matching_mailbox(request, object)
|
||||
return super(AddressAdmin, self).log_addition(request, object)
|
||||
return super(AddressAdmin, self).log_addition(request, object, *args, **kwargs)
|
||||
|
||||
def check_matching_mailbox(self, request, obj):
|
||||
# Check if new addresse matches with a mbox because of having a local domain
|
||||
|
|
|
@ -22,20 +22,21 @@ class MailboxForm(forms.ModelForm):
|
|||
def __init__(self, *args, **kwargs):
|
||||
super(MailboxForm, self).__init__(*args, **kwargs)
|
||||
# Hack the widget in order to display add button
|
||||
field = AttrDict(**{
|
||||
'to': Address,
|
||||
remote_field_mock = AttrDict(**{
|
||||
'model': Address,
|
||||
'get_related_field': lambda: AttrDict(name='id'),
|
||||
|
||||
})
|
||||
widget = self.fields['addresses'].widget
|
||||
self.fields['addresses'].widget = widgets.RelatedFieldWidgetWrapper(widget, field,
|
||||
self.modeladmin.admin_site, can_add_related=True)
|
||||
self.fields['addresses'].widget = widgets.RelatedFieldWidgetWrapper(
|
||||
widget, remote_field_mock, self.modeladmin.admin_site, can_add_related=True)
|
||||
|
||||
account = self.modeladmin.account
|
||||
# Filter related addresses by account
|
||||
old_render = self.fields['addresses'].widget.render
|
||||
def render(*args, **kwargs):
|
||||
output = old_render(*args, **kwargs)
|
||||
args = 'account=%i' % account.pk
|
||||
args = 'account=%i&mailboxes=%s' % (account.pk, self.instance.pk)
|
||||
output = output.replace('/add/?', '/add/?%s&' % args)
|
||||
return mark_safe(output)
|
||||
self.fields['addresses'].widget.render = render
|
||||
|
|
|
@ -81,6 +81,14 @@ class Mailbox(models.Model):
|
|||
if not settings.MAILBOXES_LOCAL_DOMAIN:
|
||||
raise AttributeError("Mailboxes do not have a defined local address domain.")
|
||||
return '@'.join((self.name, settings.MAILBOXES_LOCAL_DOMAIN))
|
||||
|
||||
def get_forwards(self):
|
||||
return Address.objects.filter(forward__regex=r'(^|.*\s)%s(\s.*|$)' % self.name)
|
||||
|
||||
def get_addresses(self):
|
||||
mboxes = self.addresses.all()
|
||||
forwards = self.get_forwards()
|
||||
return set(mboxes).union(set(forwards))
|
||||
|
||||
|
||||
class Address(models.Model):
|
||||
|
|
Loading…
Reference in a new issue