This repository has been archived by the owner on Jan 23, 2024. It is now read-only.
/
views.py
172 lines (131 loc) · 5.43 KB
/
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
import json
from django.conf import settings
from django.http import HttpResponse, Http404
from django.shortcuts import redirect
from django.contrib import messages
from django.core.mail import send_mail
from django.urls import reverse_lazy
from django.views import View
from django.views.generic.edit import FormView
from allauth.account import views as allauth_views
from invitations.views import SendInvite
from intake.services.mailgun_api_service import is_a_valid_mailgun_post
from . import forms
from user_accounts.base_views import StaffOnlyMixin
import intake.services.events_service as EventsService
class CustomLoginView(allauth_views.LoginView):
template_name = "user_accounts/login.jinja"
def get_form_class(self):
return forms.LoginForm
def form_invalid(self, *args):
# get the email entered, if it exists
login_email = self.request.POST.get('login', '')
# save it in the session, in case the go to password reset
if login_email:
self.request.session['failed_login_email'] = login_email
EventsService.user_failed_login(self)
return super().form_invalid(*args)
class CustomSignupView(allauth_views.SignupView):
template_name = "user_accounts/signup.jinja"
def get_form_class(self):
return forms.CustomSignUpForm
def closed(self):
return redirect('intake-home')
def form_valid(self, form):
response = super().form_valid(form)
self.request.user = self.user
EventsService.user_account_created(self)
return response
class CustomSendInvite(StaffOnlyMixin, SendInvite):
template_name = "user_accounts/invite_form.jinja"
form_class = forms.InviteForm
success_url = reverse_lazy("user_accounts-profile")
def form_valid(self, form):
invite = form.save(inviter=self.request.user)
invite.send_invitation(self.request)
messages.success(self.request,
'An email invite was sent to {}'.format(invite.email))
return redirect(self.success_url)
class UserProfileView(FormView):
template_name = "user_accounts/userprofile_form.jinja"
form_class = forms.UserProfileForm
success_url = reverse_lazy("user_accounts-profile")
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.user = None
self.profile = None
def get_user_and_profile(self):
self.user = self.user or self.request.user
self.profile = self.profile or self.user.profile
def get_initial(self):
self.get_user_and_profile()
return {
'name': self.profile.name
}
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
self.get_user_and_profile()
context.update(
user=self.user, profile=self.profile)
EventsService.user_login(self)
return context
def form_valid(self, form, *args, **kwargs):
profile = self.request.user.profile
profile.name = form.cleaned_data['name']
profile.save()
return super().form_valid(form)
class PasswordResetView(allauth_views.PasswordResetView):
template_name = 'user_accounts/request_password_reset.jinja'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# if there is an login email in the session
login_email = self.request.session.get('failed_login_email', '')
initial_email = context['form'].initial.get('email', '')
if not initial_email:
context['form'].initial['email'] = login_email
EventsService.user_reset_password(self, initial_email)
return context
class PasswordResetSentView(allauth_views.PasswordResetDoneView):
template_name = 'user_accounts/password_reset_sent.jinja'
class PasswordResetFromKeyView(allauth_views.PasswordResetFromKeyView):
template_name = 'user_accounts/change_password.jinja'
def get_form_class(self):
return forms.SetPasswordForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['reset_user'] = getattr(self, 'reset_user', None)
return context
class PasswordChangeView(allauth_views.PasswordChangeView):
template_name = 'user_accounts/change_password.jinja'
success_url = reverse_lazy("user_accounts-profile")
def get_form_class(self):
return forms.SetPasswordForm
class MailgunBouncedEmailView(View):
def post(self, request):
if not is_a_valid_mailgun_post(request):
raise Http404
to = request.POST['recipient']
error = request.POST['error']
headers = dict(json.loads(request.POST['message-headers']))
sender = headers['Sender']
subject = headers['Subject']
date = headers['Date']
bounce_message = """
A notification you sent through Clear My Record could not be delivered.
Date: {date}
Applicant email: {to}
Email subject: {subject}
Error:
{error}
Let us know if you have any questions,
Clear My Record Team
clearmyrecord@codeforamerica.org
""".format(date=date, to=to, subject=subject, error=error)
send_mail(
subject='Clear My Record: An applicant notification bounced',
message=bounce_message,
html_message=bounce_message.replace('\n', '<br>'),
from_email=settings.MAIL_DEFAULT_SENDER,
recipient_list=[sender],
fail_silently=False)
return HttpResponse()