Skip to content

Commit 2008996

Browse files
resend password email
1 parent b56c7ee commit 2008996

File tree

6 files changed

+45
-4
lines changed

6 files changed

+45
-4
lines changed

account/serializers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ class Meta:
1313
fields = [
1414
'pk', 'url', 'name', 'email', 'phone_number',
1515
'user_type', 'avatar', 'avatar_thumbnail',
16+
'last_login',
1617
]
1718
extra_kwargs = {
1819
'avatar': {'allow_null': True},
1920
'avatar_thumbnail': {'read_only': True},
2021
'user_type': {'read_only': True},
21-
'email': {'read_only': True}
22+
'email': {'read_only': True},
23+
'last_login': {'read_only': True},
2224
}
2325

2426
def validate(self, attrs):

classroom/business/teacher/classroom.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,26 @@ def add_reading_exercises_to_classroom(classroom, exercise_pks, user):
5353
def remove_reading_exercises_to_classroom(classroom, exercise_pks):
5454
classroom.reading_exercises.remove(*exercise_pks)
5555

56+
57+
def resend_password_emails(classroom, email):
58+
student = User.students.filter(email=email).first()
59+
60+
# If `last_login` is not None, meaning student already logged in successfully
61+
# so don't touch their password
62+
if not student or student.last_login:
63+
return
64+
65+
temp_password = secrets.token_urlsafe(nbytes=8)
66+
student.set_password(temp_password)
67+
student.save()
68+
69+
temp_passwords = {email: temp_password}
70+
71+
send_temp_password_for_new_students_task.delay(
72+
[email], temp_passwords, classroom.teacher.name
73+
)
74+
75+
5676
def upload_reading_exercise_image(image, request=None):
5777
path = settings.MEDIA_ROOT / 'classroom' / 'reading_exercises' / 'uploaded_images' / image.name
5878
path.parent.mkdir(parents=True, exist_ok=True)

classroom/serializers/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from .classroom import (AddReadingExerciseSerializer, AddStudentSerializer,
22
ClassroomSerializer, RemoveReadingExerciseSerializer,
3-
RemoveStudentSerializer,
3+
RemoveStudentSerializer, ResendPasswordEmailSerializer,
44
StudentReadingReportSerializer)
55
from .exercise import (ReadingExerciseSerializer,
66
ReadingExerciseSubmitSerializer,

classroom/serializers/classroom.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ class RemoveReadingExerciseSerializer(serializers.Serializer):
6161
pk = serializers.IntegerField()
6262

6363

64+
class ResendPasswordEmailSerializer(serializers.Serializer):
65+
email = serializers.EmailField()
66+
67+
6468
class _ExerciseSerializer(serializers.HyperlinkedModelSerializer):
6569
class Meta:
6670
model = ReadingExercise

classroom/tasks.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ def send_temp_password_for_new_students(student_emails, temp_passwords, teacher_
3434
message,
3535
alternatives=[
3636
(html_message, 'text/html')
37-
]
37+
],
38+
from_email='rockstarrprogrammerr@gmail.com',
39+
to=[student_email],
3840
)
3941
messages.append(message)
4042

classroom/views/classroom.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
from django.contrib.auth import get_user_model
22
from django.utils.translation import gettext as _
3+
from rest_framework import status
34
from rest_framework.decorators import action
45
from rest_framework.generics import get_object_or_404
56
from rest_framework.response import Response
67
from rest_framework.viewsets import ModelViewSet
78

8-
from classroom.business.teacher import classroom as teacher_business
99
from classroom.business.all.student_report import ReadingReportMaker
10+
from classroom.business.teacher import classroom as teacher_business
1011
from classroom.filters import ClassroomFilter
1112
from classroom.models import Classroom
1213
from classroom.permissions import IsTeacherOrReadOnly
1314
from classroom.serializers import (AddReadingExerciseSerializer,
1415
AddStudentSerializer, ClassroomSerializer,
1516
RemoveReadingExerciseSerializer,
1617
RemoveStudentSerializer,
18+
ResendPasswordEmailSerializer,
1719
StudentReadingReportSerializer)
1820

1921
User = get_user_model()
@@ -111,3 +113,14 @@ def student_reading_report(self, request, pk):
111113

112114
serializer = self.get_serializer(instance=report, many=True)
113115
return Response(serializer.data)
116+
117+
@action(
118+
methods=['POST'], detail=True, url_path='resend-password-email',
119+
serializer_class=ResendPasswordEmailSerializer,
120+
)
121+
def resend_password_email(self, request, pk):
122+
serializer = self.get_serializer(data=request.data)
123+
serializer.is_valid(raise_exception=True)
124+
classroom = self.get_object()
125+
teacher_business.resend_password_emails(classroom, serializer.validated_data['email'])
126+
return Response(status=status.HTTP_202_ACCEPTED)

0 commit comments

Comments
 (0)