def list_member_options(request, list_id, email): template_name = 'postorius/lists/memberoptions.html' mm_list = List.objects.get_or_404(fqdn_listname=list_id) try: mm_member = mm_list.find_members(address=email)[0] member_prefs = mm_member.preferences except (ValueError, IndexError): raise Http404(_('Member does not exist')) except Mailman404Error: return render(request, template_name, {'nolists': 'true'}) initial_moderation = dict([ (key, getattr(mm_member, key)) for key in MemberModeration.base_fields ]) if request.method == 'POST': if request.POST.get("formname") == 'preferences': preferences_form = UserPreferences( request.POST, preferences=member_prefs) if preferences_form.is_valid(): try: preferences_form.save() except HTTPError as e: messages.error(request, e.msg.decode()) else: messages.success(request, _("The member's preferences" " have been updated.")) return redirect('list_member_options', list_id, email) elif request.POST.get("formname") == 'moderation': moderation_form = MemberModeration( request.POST, initial=initial_moderation) if moderation_form.is_valid(): if not moderation_form.has_changed(): messages.info( request, _("No change to the member's moderation.")) return redirect('list_member_options', list_id, email) for key in list(moderation_form.fields.keys()): # In general, it would be a very bad idea to loop over the # fields and try to set them one by one, However, # moderation form has only one field. setattr(mm_member, key, moderation_form.cleaned_data[key]) try: mm_member.save() except HTTPError as e: messages.error(request, e.msg.decode()) else: messages.success(request, _("The member's moderation " "settings have been updated.")) return redirect('list_member_options', list_id, email) else: preferences_form = UserPreferences(preferences=member_prefs) moderation_form = MemberModeration(initial=initial_moderation) return render(request, template_name, { 'mm_member': mm_member, 'list': mm_list, 'preferences_form': preferences_form, 'moderation_form': moderation_form, })