Skip to content

Commit df07a19

Browse files
committed
Send email to staff member upon account creation
1 parent d331bef commit df07a19

File tree

5 files changed

+60
-6
lines changed

5 files changed

+60
-6
lines changed

appointment/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
__package_name__ = "django-appointment"
66
__url__ = "https://github.com/adamspd/django-appointment"
77
__package_website__ = "https://django-appt.adamspierredavid.com/"
8-
__version__ = "3.3.4"
8+
__version__ = "3.3.5"
99
__test_version__ = False

appointment/services.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
get_staff_member_from_user_id_or_logged_in, get_times_from_config, get_user_by_email,
3030
get_weekday_num_from_date, get_working_hours_for_staff_and_day, parse_name, update_appointment_reminder,
3131
working_hours_exist)
32+
from appointment.utils.email_ops import send_reset_link_to_staff_member
3233
from appointment.utils.error_codes import ErrorCode
3334
from appointment.utils.json_context import convert_appointment_to_json, get_generic_context, json_response
3435
from appointment.utils.permissions import check_entity_ownership
@@ -513,7 +514,7 @@ def email_change_verification_service(code, email, old_email):
513514
return False
514515

515516

516-
def create_staff_member_service(post_data):
517+
def create_staff_member_service(post_data, request):
517518
form = PersonalInformationForm(post_data)
518519
if form.is_valid():
519520
first_name = form.cleaned_data['first_name']
@@ -533,6 +534,7 @@ def create_staff_member_service(post_data):
533534
if not user.is_superuser:
534535
user.is_staff = True
535536
user.save()
537+
send_reset_link_to_staff_member(user, request, user.email)
536538
return user, True, None
537539
else:
538540
return None, False, get_error_message_in_form(form=form)

appointment/tests/test_services.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,10 @@ class CreateStaffMemberServiceTest(BaseTest):
589589

590590
def setUp(self):
591591
super().setUp()
592+
self.factory = RequestFactory()
593+
594+
# Setup request object
595+
self.request = self.factory.post('/')
592596

593597
def test_valid_data(self):
594598
"""Test if a staff member can be created with valid data."""
@@ -597,7 +601,7 @@ def test_valid_data(self):
597601
'last_name': 'Doe',
598602
'email': '[email protected]'
599603
}
600-
user, success, error_message = create_staff_member_service(post_data)
604+
user, success, error_message = create_staff_member_service(post_data, self.request)
601605

602606
self.assertTrue(success)
603607
self.assertIsNotNone(user)
@@ -613,7 +617,7 @@ def test_invalid_data(self):
613617
'last_name': 'Doe',
614618
'email': '[email protected]'
615619
}
616-
user, success, error_message = create_staff_member_service(post_data)
620+
user, success, error_message = create_staff_member_service(post_data, self.request)
617621

618622
self.assertFalse(success)
619623
self.assertIsNone(user)
@@ -627,7 +631,7 @@ def test_email_already_exists(self):
627631
'last_name': 'Doe',
628632
'email': '[email protected]' # Using an email that already exists
629633
}
630-
user, success, error_message = create_staff_member_service(post_data)
634+
user, success, error_message = create_staff_member_service(post_data, self.request)
631635

632636
self.assertFalse(success)
633637
self.assertIsNone(user)

appointment/utils/email_ops.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,54 @@ def send_thank_you_email(ar: AppointmentRequest, user, request, email: str, appo
8888
)
8989

9090

91+
def send_reset_link_to_staff_member(user, request, email: str, account_details=None):
92+
"""Email the staff member to set a password.
93+
94+
:param user: The user who booked the appointment.
95+
:param email: The email address of the client.
96+
:param account_details: Additional details about the account (default None).
97+
:param request: The request object.
98+
:return: None
99+
"""
100+
# Month and year like "J A N 2 0 2 1"
101+
token = PasswordResetToken.create_token(user=user, expiration_minutes=10080) # 7 days expiration
102+
ui_db64 = urlsafe_base64_encode(force_bytes(user.pk))
103+
relative_set_passwd_link = reverse('appointment:set_passwd', args=[ui_db64, token.token])
104+
set_passwd_link = get_absolute_url_(relative_set_passwd_link, request=request)
105+
106+
message = _("""
107+
Hello {first_name},
108+
109+
A request has been received to set a password for your staff account for the year {current_year} at {company}.
110+
111+
Please click the link below to set up your new password:
112+
{activation_link}
113+
114+
To login, if ask for a username, use '{username}', otherwise use your email address.
115+
116+
If you did not request this, please ignore this email.
117+
118+
{account_details}
119+
120+
Regards,
121+
{company}
122+
""").format(
123+
first_name=user.first_name,
124+
current_year=datetime.datetime.now().year,
125+
company=get_website_name(),
126+
activation_link=set_passwd_link,
127+
account_details=account_details if account_details else _("No additional details provided."),
128+
username=user.username
129+
)
130+
131+
# Assuming send_email is a method you have that sends an email
132+
send_email(
133+
recipient_list=[email],
134+
subject=_("Set Your Password for {company}").format(company=get_website_name()),
135+
message=message,
136+
)
137+
138+
91139
def notify_admin_about_appointment(appointment, client_name: str):
92140
"""Notify the admin and the staff member about a new appointment request."""
93141
email_context = {

appointment/views_admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ def email_change_verification_code(request):
379379
@require_superuser
380380
def create_new_staff_member(request):
381381
if request.method == 'POST':
382-
user, is_valid, error_message = create_staff_member_service(request.POST)
382+
user, is_valid, error_message = create_staff_member_service(request.POST, request)
383383
if is_valid:
384384
return redirect('appointment:user_profile', staff_user_id=user.pk)
385385
else:

0 commit comments

Comments
 (0)