Imporved mailbox custom filtering management

This commit is contained in:
Marc Aymerich 2016-02-19 11:51:26 +00:00
parent ebd5ff03ce
commit e388346f9a
3 changed files with 16 additions and 7 deletions

View File

@ -174,6 +174,15 @@ class MailboxAdmin(ChangePasswordAdminMixin, SelectAccountAdminMixin, ExtendedMo
def save_model(self, request, obj, form, change): def save_model(self, request, obj, form, change):
""" save hacky mailbox.addresses and local domain clashing """ """ save hacky mailbox.addresses and local domain clashing """
if obj.filtering != obj.CUSTOM:
msg = _("You have provided a custom filtering but filtering "
"selected option is %s") % obj.get_filtering_display()
if change:
old = Mailbox.objects.get(pk=obj.pk)
if old.custom_filtering != obj.custom_filtering:
messages.warning(request, msg)
elif obj.custom_filtering:
messages.warning(request, msg)
super(MailboxAdmin, self).save_model(request, obj, form, change) super(MailboxAdmin, self).save_model(request, obj, form, change)
obj.addresses = form.cleaned_data['addresses'] obj.addresses = form.cleaned_data['addresses']

View File

@ -15,8 +15,8 @@ class MailboxForm(forms.ModelForm):
""" hacky form for adding reverse M2M form field for Mailbox.addresses """ """ hacky form for adding reverse M2M form field for Mailbox.addresses """
# TODO keep track of this ticket for future reimplementation # TODO keep track of this ticket for future reimplementation
# https://code.djangoproject.com/ticket/897 # https://code.djangoproject.com/ticket/897
addresses = forms.ModelMultipleChoiceField(queryset=Address.objects.select_related('domain'), addresses = forms.ModelMultipleChoiceField(required=False,
required=False, queryset=Address.objects.select_related('domain'),
widget=widgets.FilteredSelectMultiple(verbose_name=_('addresses'), is_stacked=False)) widget=widgets.FilteredSelectMultiple(verbose_name=_('addresses'), is_stacked=False))
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -30,16 +30,17 @@ class MailboxForm(forms.ModelForm):
self.fields['addresses'].widget = widgets.RelatedFieldWidgetWrapper(widget, field, self.fields['addresses'].widget = widgets.RelatedFieldWidgetWrapper(widget, field,
self.modeladmin.admin_site, can_add_related=True) self.modeladmin.admin_site, can_add_related=True)
account = self.modeladmin.account
# Filter related addresses by account # Filter related addresses by account
old_render = self.fields['addresses'].widget.render old_render = self.fields['addresses'].widget.render
def render(*args, **kwargs): def render(*args, **kwargs):
output = old_render(*args, **kwargs) output = old_render(*args, **kwargs)
args = 'account=%i' % self.modeladmin.account.pk args = 'account=%i' % account.pk
output = output.replace('/add/?', '/add/?%s&' % args) output = output.replace('/add/?', '/add/?%s&' % args)
return mark_safe(output) return mark_safe(output)
self.fields['addresses'].widget.render = render self.fields['addresses'].widget.render = render
queryset = self.fields['addresses'].queryset queryset = self.fields['addresses'].queryset
realted_addresses = queryset.filter(account_id=self.modeladmin.account.pk).order_by('name') realted_addresses = queryset.filter(account_id=account.pk).order_by('name')
self.fields['addresses'].queryset = realted_addresses self.fields['addresses'].queryset = realted_addresses
if self.instance and self.instance.pk: if self.instance and self.instance.pk:

View File

@ -60,9 +60,7 @@ class Mailbox(models.Model):
return os.path.normpath(settings.MAILBOXES_HOME % context) return os.path.normpath(settings.MAILBOXES_HOME % context)
def clean(self): def clean(self):
if self.custom_filtering and self.filtering != self.CUSTOM: if self.filtering == self.CUSTOM and not self.custom_filtering:
self.custom_filtering = ''
elif self.filtering == self.CUSTOM and not self.custom_filtering:
raise ValidationError({ raise ValidationError({
'custom_filtering': _("Custom filtering is selected but not provided.") 'custom_filtering': _("Custom filtering is selected but not provided.")
}) })
@ -70,6 +68,7 @@ class Mailbox(models.Model):
def get_filtering(self): def get_filtering(self):
name, content = settings.MAILBOXES_MAILBOX_FILTERINGS[self.filtering] name, content = settings.MAILBOXES_MAILBOX_FILTERINGS[self.filtering]
if callable(content): if callable(content):
# Custom filtering
content = content(self) content = content(self)
return (name, content) return (name, content)