Skip to content

Commit 382eb10

Browse files
committed
add send reset email button to user edit page
Fixes #154
1 parent e698599 commit 382eb10

File tree

5 files changed

+71
-1
lines changed

5 files changed

+71
-1
lines changed

ceuk-marking/urls.py

+5
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,11 @@
248248
volunteers.VolunteerAddView.as_view(),
249249
name="add_volunteer",
250250
),
251+
path(
252+
"volunteers/reset_email/",
253+
volunteers.VolunteerSendResetEmailView.as_view(),
254+
name="reset_volunteer_email",
255+
),
251256
path(
252257
"volunteers/<pk>/",
253258
volunteers.VolunteerEditView.as_view(),

crowdsourcer/forms.py

+4
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,10 @@ class Meta:
393393
MarkerFormset = inlineformset_factory(User, Marker, form=MarkerForm, can_delete=False)
394394

395395

396+
class ResetEmailForm(Form):
397+
user_id = CharField(required=True, widget=HiddenInput)
398+
399+
396400
class VolunteerAssignentForm(ModelForm):
397401
def __init__(self, session=None, **kwargs):
398402
super().__init__(**kwargs)

crowdsourcer/templates/crowdsourcer/volunteers/edit.html

+11-1
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,22 @@ <h1 class="mb-4">Sign in</h1>
1010
<h1 class="mb-4">Edit Volunteer</h1>
1111

1212

13+
<div class="mb-4">
1314
<form action="" method="post">
1415
{% csrf_token %}
1516
{% bootstrap_form form %}
1617
{% bootstrap_formset formset %}
17-
<input type="submit" value="Update">
18+
<input class="btn btn-primary" type="submit" value="Update">
1819
</form>
20+
</div>
21+
22+
<div class="mb-4">
23+
<form action="{% session_url 'reset_volunteer_email' %}" method="post">
24+
{% csrf_token %}
25+
{{ reset_form }}
26+
<input class="btn btn-secondary" type="submit" value="Send Reset Email">
27+
</form>
28+
</div>
1929

2030
{% endif %}
2131
{% endblock %}

crowdsourcer/views/volunteers.py

+24
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from crowdsourcer.forms import (
1212
MarkerForm,
1313
MarkerFormset,
14+
ResetEmailForm,
1415
UserForm,
1516
VolunteerAssignmentFormset,
1617
VolunteerBulkAssignForm,
@@ -23,6 +24,7 @@
2324
ResponseType,
2425
Section,
2526
)
27+
from crowdsourcer.volunteers import send_registration_email
2628

2729
logger = logging.getLogger(__name__)
2830

@@ -118,13 +120,16 @@ def get_form(self, form_class=None):
118120
def get_context_data(self, **kwargs):
119121
context = super().get_context_data(**kwargs)
120122

123+
reset_form = ResetEmailForm(initial={"user_id": self.user.id})
124+
121125
formset = MarkerFormset(
122126
instance=self.user,
123127
form_kwargs={"session": self.request.current_session},
124128
**self.get_form_kwargs()
125129
)
126130

127131
context["formset"] = formset
132+
context["reset_form"] = reset_form
128133

129134
return context
130135

@@ -139,6 +144,25 @@ def form_valid(self, form):
139144
return super().form_valid(form)
140145

141146

147+
class VolunteerSendResetEmailView(VolunteerAccessMixin, FormView):
148+
form_class = ResetEmailForm
149+
template_name = "crowdsourcer/volunteers/edit.html"
150+
151+
def get_success_url(self):
152+
return reverse(
153+
"session_urls:list_volunteers",
154+
kwargs={"marking_session": self.request.current_session.label},
155+
)
156+
157+
def form_valid(self, form):
158+
if form.is_valid():
159+
user_id = form.cleaned_data["user_id"]
160+
user = get_object_or_404(User, pk=user_id)
161+
send_registration_email(user, self.request.get_host())
162+
163+
return super().form_valid(form)
164+
165+
142166
class VolunteerAssignentView(VolunteerAccessMixin, FormView):
143167
template_name = "crowdsourcer/volunteers/assign.html"
144168
form_class = VolunteerAssignmentFormset

crowdsourcer/volunteers.py

+27
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
from collections import defaultdict
22

3+
from django.conf import settings
4+
from django.contrib.auth.forms import PasswordResetForm
5+
from django.http import HttpRequest
6+
37
import pandas as pd
48

59
from crowdsourcer.models import Assigned, PublicAuthority, Section
@@ -75,3 +79,26 @@ def check_bulk_assignments(df, rt, ms, num_assignments, always_assign=False):
7579
)
7680

7781
return errors
82+
83+
84+
def send_registration_email(user, server_name, cobrand=None):
85+
subject_template = "registration/initial_password_email_subject.txt"
86+
email_template = "registration/initial_password_email.html"
87+
if cobrand is not None:
88+
subject_template = f"registration/{cobrand}/initial_password_email_subject.txt"
89+
email_template = f"registration/{cobrand}/initial_password_email.html"
90+
91+
if user.email:
92+
form = PasswordResetForm({"email": user.email})
93+
assert form.is_valid()
94+
request = HttpRequest()
95+
request.META["SERVER_NAME"] = server_name
96+
request.META["SERVER_PORT"] = 443
97+
form.save(
98+
request=request,
99+
domain_override=server_name,
100+
use_https=True,
101+
from_email=settings.DEFAULT_FROM_EMAIL,
102+
subject_template_name=subject_template,
103+
email_template_name=email_template,
104+
)

0 commit comments

Comments
 (0)