From 54f9ea0bffcdaab4c0021d76a00bfd66ba203b33 Mon Sep 17 00:00:00 2001 From: yourcoke <deinkoks@gmail.com> Date: Sun, 27 Dec 2020 18:46:11 +0100 Subject: [PATCH] crude implementation for a editMail feature. --- src/plainui/forms.py | 1 + src/plainui/jinja2/plainui/profile.html | 4 +-- src/plainui/urls.py | 1 + src/plainui/views.py | 37 ++++++++++++++++++++++++- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/plainui/forms.py b/src/plainui/forms.py index 4a391b34a..a8b8013b4 100644 --- a/src/plainui/forms.py +++ b/src/plainui/forms.py @@ -253,5 +253,6 @@ class ReportForm(forms.Form): message=body, ) + class EditMailForm(forms.Form): email = forms.EmailField() diff --git a/src/plainui/jinja2/plainui/profile.html b/src/plainui/jinja2/plainui/profile.html index c8337f6fd..cbb264dec 100644 --- a/src/plainui/jinja2/plainui/profile.html +++ b/src/plainui/jinja2/plainui/profile.html @@ -22,10 +22,10 @@ <dt>{{ _("email") }}</dt> <dd> <div> - <form class="form-inline"> + <form class="form-inline" method="POST" action="{{ url('plainui:userprofile-edit-mail', conf_slug=conf.slug) }}"> {{ csrf_input }} <label class="sr-only" for="emailInput">eMail</label> - <input class="form-control mb-2 mr-sm-2" id="emailInput" placeholder="mail@some.where" type="email" name="email" value="{{ user.communication_channels.filter(channel='mail', is_verified=True).first().address or "" }}"> + <input class="form-control mb-2 mr-sm-2" id="emailInput" placeholder="(optional)" type="email" name="email" value="{{ user.communication_channels.filter(channel='mail', is_verified=True).first().address or "" }}"> <button type="submit" class="btn btn-primary mb-2">{{ _("save") }}</button> </form> </div> diff --git a/src/plainui/urls.py b/src/plainui/urls.py index d496fe3fe..cadde64b5 100644 --- a/src/plainui/urls.py +++ b/src/plainui/urls.py @@ -16,6 +16,7 @@ urlpatterns = [ path('<slug:conf_slug>/reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'), path('<slug:conf_slug>/logout', views.LogoutView.as_view(), name='logout'), path('<slug:conf_slug>/me', views.ProfileView.as_view(), name='userprofile'), + path('<slug:conf_slug>/me/mail/update', views.EditMailView.as_view(), name='userprofile-edit-mail'), path('<slug:conf_slug>/redeem_token', views.RedeemTokenView.as_view(), name='redeem_token'), path('<slug:conf_slug>/redeem_token_add', views.RedeemTokenAddToUserView.as_view(), name='redeem_token_add_to_user'), path('<slug:conf_slug>/redeem_token_create', views.RedeemTokenUserCreateView.as_view(), name='redeem_token_create_user'), diff --git a/src/plainui/views.py b/src/plainui/views.py index 121d34925..566ad2ae0 100644 --- a/src/plainui/views.py +++ b/src/plainui/views.py @@ -24,7 +24,8 @@ from django.views.generic.edit import FormView, UpdateView from core import integrations from core.forms import PasswordResetForm from core.models import Assembly, AssemblyLikeCount, Badge, Conference, ConferenceMember, ConferenceMemberTicket, ConferenceTag, \ - ConferenceTrack, DirectMessage, Event, EventAttachment, EventLikeCount, EventParticipant, PlatformUser, Room, RoomLink, StaticPage, TagItem, UserBadge + ConferenceTrack, DirectMessage, Event, EventAttachment, EventLikeCount, EventParticipant, PlatformUser, Room, RoomLink, \ + StaticPage, TagItem, UserBadge, UserCommunicationChannel from core.models.ticket import TicketValidationError from core.search import search from core.utils import render_markdown @@ -405,6 +406,40 @@ class ProfileView(ConferenceRequiredMixin, UpdateView): return resp +class EditMailView(ConferenceRequiredMixin, FormView): + form_class = EditMailForm + template_name = 'plainui/profile.html' + + require_login = True + require_conference_member = True + + def get(self, request, *args, **kwargs): + return redirect(reverse('plainui:redeem_token', kwargs={'conf_slug': self.conf.slug})) + + def get_context_data(self, *args, **kwargs): + context = super().get_context_data(**kwargs) + context['conf'] = self.conf + context['hide_header'] = True + return context + + def form_valid(self, form: EditMailForm): + # We don't verify mails (yet) + # TODO: error handling + # verification + mail_channel, created = UserCommunicationChannel.objects.update_or_create( + channel = UserCommunicationChannel.Channel.MAIL, + is_verified = True, + user = self.request.user + ) + mail_channel.address = form.cleaned_data['email'] + mail_channel.save() + messages.success(self.request, gettext("eMail changed.")) + return redirect(reverse('plainui:userprofile', kwargs={'conf_slug': self.conf.slug})) + + def get_success_url(self): + return redirect(reverse('plainui:userprofile', kwargs={'conf_slug': self.conf.slug})) + + class RedeemTokenView(ConferenceRequiredMixin, TemplateView): template_name = 'plainui/redeem_token.html' require_login = False -- GitLab