def user_list_options(request, list_id): utils.set_other_emails(request.user) mlist = List.objects.get_or_404(fqdn_listname=list_id) mm_user = MailmanUser.objects.get(address=request.user.email) subscription = None for s in mm_user.subscriptions: if s.role == 'member' and s.list_id == list_id: subscription = s break if not subscription: raise Http404(_('Subscription does not exist')) preferences = subscription.preferences if request.method == 'POST': form = UserPreferences(request.POST) if form.is_valid(): for key in form.cleaned_data.keys(): if form.cleaned_data[key] is not None: # None: nothing set yet. Remember to remove this test # when Mailman accepts None as a "reset to default" # value. preferences[key] = form.cleaned_data[key] preferences.save() messages.success(request, _('Your preferences have been updated.')) return redirect('user_list_options', list_id) else: messages.error(request, _('Something went wrong.')) else: form = UserPreferences(initial=subscription.preferences) user_emails = [request.user.email] + request.user.other_emails subscription_form = ChangeSubscriptionForm( user_emails, initial={'email': subscription.email}) return render(request, 'postorius/user/list_options.html', {'form': form, 'list': mlist, 'change_subscription_form': subscription_form})
def user_profile(request): utils.set_other_emails(request.user) try: mm_user = MailmanUser.objects.get_or_create_from_django(request.user) except MailmanApiError: return utils.render_api_error(request) if request.method == 'POST': if request.POST.get('formname') == 'displayname': display_name_form = ChangeDisplayNameForm(request.POST) form = AddressActivationForm( initial={'user_email': request.user.email}) if display_name_form.is_valid(): name = display_name_form.cleaned_data['display_name'] try: mm_user.display_name = name mm_user.save() except MailmanApiError: return utils.render_api_error(request) except HTTPError as e: messages.error(request, e) else: messages.success(request, _('Display name changed')) return redirect('user_profile') else: display_name_form = ChangeDisplayNameForm( initial={'display_name': mm_user.display_name}) form = AddressActivationForm(request.POST) if form.is_valid(): profile, c = ( AddressConfirmationProfile.objects.update_or_create( email=form.cleaned_data['email'], user=request.user, defaults={'activation_key': uuid.uuid4().hex})) try: profile.send_confirmation_link(request) messages.success( request, _('Please follow the instructions sent via' ' email to confirm the address')) return redirect('user_profile') except (SMTPException, socket_error) as e: if (not isinstance(e, SMTPException) and e.errno != errno.ECONNREFUSED): raise e profile.delete() messages.error( request, _('Currently emails can not be added,' ' please try again later')) else: form = AddressActivationForm( initial={'user_email': request.user.email}) display_name_form = ChangeDisplayNameForm( initial={'display_name': mm_user.display_name}) return render(request, 'postorius/user/profile.html', { 'mm_user': mm_user, 'form': form, 'name_form': display_name_form })
def user_is_in_list_roster(user, mailing_list, roster): if not user.is_authenticated(): return False if not hasattr(user, 'other_emails'): set_other_emails(user) addresses = set([user.email]) | set(user.other_emails) if addresses & set(getattr(mailing_list, roster)): return True # At least one address is in the roster return False
def user_subscriptions(request): """Shows the subscriptions of a user.""" utils.set_other_emails(request.user) try: mm_user = MailmanUser.objects.get_or_create_from_django(request.user) except MailmanApiError: return utils.render_api_error(request) memberships = [m for m in mm_user.subscriptions if m.role == 'member'] return render(request, 'postorius/user/subscriptions.html', {'memberships': memberships})
def user_profile(request): utils.set_other_emails(request.user) try: mm_user = MailmanUser.objects.get_or_create_from_django(request.user) except MailmanApiError: return utils.render_api_error(request) if request.method == 'POST': if request.POST.get('formname') == 'displayname': display_name_form = ChangeDisplayNameForm(request.POST) form = AddressActivationForm( initial={'user_email': request.user.email}) if display_name_form.is_valid(): name = display_name_form.cleaned_data['display_name'] try: mm_user.display_name = name mm_user.save() except MailmanApiError: return utils.render_api_error(request) except HTTPError as e: messages.error(request, e) else: messages.success(request, _('Display name changed')) return redirect('user_profile') else: display_name_form = ChangeDisplayNameForm( initial={'display_name': mm_user.display_name}) form = AddressActivationForm(request.POST) if form.is_valid(): profile, c = ( AddressConfirmationProfile.objects.update_or_create( email=form.cleaned_data['email'], user=request.user, defaults={'activation_key': uuid.uuid4().hex})) try: profile.send_confirmation_link(request) messages.success(request, _( 'Please follow the instructions sent via' ' email to confirm the address')) return redirect('user_profile') except (SMTPException, socket_error) as e: if (not isinstance(e, SMTPException) and e.errno != errno.ECONNREFUSED): raise e profile.delete() messages.error(request, _('Currently emails can not be added,' ' please try again later')) else: form = AddressActivationForm( initial={'user_email': request.user.email}) display_name_form = ChangeDisplayNameForm( initial={'display_name': mm_user.display_name}) return render(request, 'postorius/user/profile.html', {'mm_user': mm_user, 'form': form, 'name_form': display_name_form})
def dispatch(self, request, *args, **kwargs): # get the list object. if 'list_id' in kwargs: self.mailing_list = self._get_list(kwargs['list_id'], int(kwargs.get('page', 1))) utils.set_other_emails(request.user) set_user_access_props(request.user, self.mailing_list) # set the template if 'template' in kwargs: self.template = kwargs['template'] return super(MailingListView, self).dispatch(request, *args, **kwargs)
def address_activation_link(request, activation_key): """ Checks the given activation_key. If it is valid, the saved address will be added to mailman. Also, the corresponding profile record will be removed. If the key is not valid, it will be ignored. """ try: profile = AddressConfirmationProfile.objects.get( activation_key=activation_key) if request.user != profile.user: return redirect('{}?next={}'.format(reverse(settings.LOGIN_URL), request.path)) if not profile.is_expired: # Add the address to the user record in Mailman. logger.info('Adding address %s to %s', profile.email, request.user.email) try: try: mailman_user = MailmanUser.objects.get( address=request.user.email) except Mailman404Error: mailman_user = MailmanUser.objects.create( request.user.email, '') # If the adress already exists, it's an import artefact: it's # been validated by email, so it's safe to merge. mm_address = mailman_user.add_address(profile.email, absorb_existing=True) # The address has just been verified. if not mm_address.verified_on: mm_address.verify() except (MailmanApiError, MailmanConnectionError): messages.error(request, _('The address could not be added.')) return # Reset the other_emails cache if hasattr(request.user, 'other_emails'): del request.user.other_emails utils.set_other_emails(request.user) messages.success(request, _('The email address has been activated!')) else: messages.error( request, _('The activation link has expired,' ' please add the email again!')) profile.delete() except AddressConfirmationProfile.DoesNotExist: messages.error(request, _('The activation link is invalid')) return redirect('user_profile')
def address_activation_link(request, activation_key): """ Checks the given activation_key. If it is valid, the saved address will be added to mailman. Also, the corresponding profile record will be removed. If the key is not valid, it will be ignored. """ try: profile = AddressConfirmationProfile.objects.get( activation_key=activation_key) if request.user != profile.user: return redirect('{}?next={}'.format( reverse(settings.LOGIN_URL), request.path)) if not profile.is_expired: # Add the address to the user record in Mailman. logger.info('Adding address %s to %s', profile.email, request.user.email) try: try: mailman_user = MailmanUser.objects.get( address=request.user.email) except Mailman404Error: mailman_user = MailmanUser.objects.create( request.user.email, '') # If the adress already exists, it's an import artefact: it's # been validated by email, so it's safe to merge. mm_address = mailman_user.add_address( profile.email, absorb_existing=True) # The address has just been verified. if not mm_address.verified_on: mm_address.verify() except (MailmanApiError, MailmanConnectionError): messages.error(request, _('The address could not be added.')) return # Reset the other_emails cache if hasattr(request.user, 'other_emails'): del request.user.other_emails utils.set_other_emails(request.user) messages.success(request, _('The email address has been activated!')) else: messages.error(request, _('The activation link has expired,' ' please add the email again!')) profile.delete() except AddressConfirmationProfile.DoesNotExist: messages.error(request, _('The activation link is invalid')) return redirect('user_profile')
def user_list_options(request, list_id): utils.set_other_emails(request.user) mlist = List.objects.get_or_404(fqdn_listname=list_id) mm_user = MailmanUser.objects.get(address=request.user.email) subscription = None for s in mm_user.subscriptions: if s.role == 'member' and s.list_id == list_id: subscription = s break if not subscription: raise Http404(_('Subscription does not exist')) preferences = subscription.preferences if request.method == 'POST': form = UserPreferences(request.POST) if form.is_valid(): for key in form.cleaned_data.keys(): if form.cleaned_data[key] is not None: # None: nothing set yet. Remember to remove this test # when Mailman accepts None as a "reset to default" # value. preferences[key] = form.cleaned_data[key] preferences.save() messages.success(request, _('Your preferences have been updated.')) return redirect('user_list_options', list_id) else: messages.error(request, _('Something went wrong.')) else: form = UserPreferences(initial=subscription.preferences) user_emails = [request.user.email] + request.user.other_emails subscription_form = ChangeSubscriptionForm( user_emails, initial={'email': subscription.email}) return render(request, 'postorius/user/list_options.html', { 'form': form, 'list': mlist, 'change_subscription_form': subscription_form })
def process_request(self, request): utils.set_other_emails(request.user)