Skip to content

Commit 9e07f2a

Browse files
committed
add send reset email button to user edit page
Fixes #154
1 parent 97c19b2 commit 9e07f2a

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
@@ -247,6 +247,11 @@
247247
volunteers.VolunteerAddView.as_view(),
248248
name="add_volunteer",
249249
),
250+
path(
251+
"volunteers/reset_email/",
252+
volunteers.VolunteerSendResetEmailView.as_view(),
253+
name="reset_volunteer_email",
254+
),
250255
path(
251256
"volunteers/<pk>/",
252257
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,11 +11,13 @@
1111
from crowdsourcer.forms import (
1212
MarkerForm,
1313
MarkerFormset,
14+
ResetEmailForm,
1415
UserForm,
1516
VolunteerAssignmentFormset,
1617
VolunteerBulkAssignForm,
1718
)
1819
from crowdsourcer.models import Assigned, Marker, PublicAuthority, ResponseType, Section
20+
from crowdsourcer.volunteers import send_registration_email
1921

2022
logger = logging.getLogger(__name__)
2123

@@ -111,13 +113,16 @@ def get_form(self, form_class=None):
111113
def get_context_data(self, **kwargs):
112114
context = super().get_context_data(**kwargs)
113115

116+
reset_form = ResetEmailForm(initial={"user_id": self.user.id})
117+
114118
formset = MarkerFormset(
115119
instance=self.user,
116120
form_kwargs={"session": self.request.current_session},
117121
**self.get_form_kwargs()
118122
)
119123

120124
context["formset"] = formset
125+
context["reset_form"] = reset_form
121126

122127
return context
123128

@@ -132,6 +137,25 @@ def form_valid(self, form):
132137
return super().form_valid(form)
133138

134139

140+
class VolunteerSendResetEmailView(VolunteerAccessMixin, FormView):
141+
form_class = ResetEmailForm
142+
template_name = "crowdsourcer/volunteers/edit.html"
143+
144+
def get_success_url(self):
145+
return reverse(
146+
"session_urls:list_volunteers",
147+
kwargs={"marking_session": self.request.current_session.label},
148+
)
149+
150+
def form_valid(self, form):
151+
if form.is_valid():
152+
user_id = form.cleaned_data["user_id"]
153+
user = get_object_or_404(User, pk=user_id)
154+
send_registration_email(user, self.request.get_host())
155+
156+
return super().form_valid(form)
157+
158+
135159
class VolunteerAssignentView(VolunteerAccessMixin, FormView):
136160
template_name = "crowdsourcer/volunteers/assign.html"
137161
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)