1212from django .urls import reverse
1313from django_email_learning .models import (
1414 ApiKey ,
15+ AssignmentSubmission ,
1516 ContentDelivery ,
1617 CourseInstructor ,
1718 DeliveryStatus ,
@@ -792,11 +793,19 @@ class EventType(enum.StrEnum):
792793 VERIFIED = "verified"
793794 DEACTIVATED = "deactivated"
794795 QUIZ_SUBMITED = "quiz_submitted"
796+ ASSIGNMENT_SUBMITTED = "assignment_submitted"
797+ ASSIGNMENT_REVIEWED = "assignment_reviewed"
795798 CONTENT_SENT = "content_sent"
796799 REMINDER_SENT = "reminder_sent"
797800 COURSE_COMPLETED = "course_completed"
798801
799802
803+ class ReviewResult (enum .StrEnum ):
804+ APPROVED = "approved"
805+ REJECTED = "rejected"
806+ REQUESTING_CHANGES = "requesting_changes"
807+
808+
800809class DeactivatedEvent (BaseModel ):
801810 type : Literal [EventType .DEACTIVATED ] = Field (
802811 default = EventType .DEACTIVATED , exclude = True
@@ -816,6 +825,24 @@ class QuizSubmitedEvent(BaseModel):
816825 is_practice : bool
817826
818827
828+ class AssignmentSubmitedEvent (BaseModel ):
829+ type : Literal [EventType .ASSIGNMENT_SUBMITTED ] = Field (
830+ default = EventType .ASSIGNMENT_SUBMITTED , exclude = True
831+ )
832+ assignment_id : int
833+ assignment_title : str
834+
835+
836+ class AssignmentReviewdEvent (BaseModel ):
837+ type : Literal [EventType .ASSIGNMENT_REVIEWED ] = Field (
838+ default = EventType .ASSIGNMENT_REVIEWED , exclude = True
839+ )
840+ assignment_id : int
841+ assignment_title : str
842+ review_result : ReviewResult
843+ reviewed_by : str
844+
845+
819846class ReminderSentEvent (BaseModel ):
820847 type : Literal [EventType .REMINDER_SENT ] = Field (
821848 default = EventType .REMINDER_SENT , exclude = True
@@ -836,7 +863,7 @@ class ContentSentEvent(BaseModel):
836863class Event (BaseModel ):
837864 type : EventType
838865 timestamp : datetime
839- event_data : DeactivatedEvent | QuizSubmitedEvent | ContentSentEvent | ReminderSentEvent | None = Field (
866+ event_data : DeactivatedEvent | QuizSubmitedEvent | ContentSentEvent | AssignmentSubmitedEvent | AssignmentReviewdEvent | ReminderSentEvent | None = Field (
840867 discriminator = "type"
841868 ) # REGISTERED, VERIFIED, COURSE_COMPLETED have no additional data
842869
@@ -897,6 +924,35 @@ def from_django_model(enrollment: Enrollment) -> "EnrollmentResponse":
897924 ),
898925 )
899926 )
927+ submission = delivery .assignment_submission # type: ignore[attr-defined]
928+ if submission :
929+ events .append (
930+ Event (
931+ type = EventType .ASSIGNMENT_SUBMITTED ,
932+ timestamp = submission .submitted_at , # type: ignore[arg-type]
933+ event_data = AssignmentSubmitedEvent (
934+ assignment_id = delivery .course_content .assignment .id , # type: ignore[union-attr]
935+ assignment_title = delivery .course_content .assignment .title , # type: ignore[union-attr]
936+ ),
937+ )
938+ )
939+ if (
940+ submission .reviewed_at
941+ and submission .status
942+ != AssignmentSubmission .SubmissionStatus .PENDING_REVIEW
943+ ):
944+ events .append (
945+ Event (
946+ type = EventType .ASSIGNMENT_REVIEWED ,
947+ timestamp = submission .reviewed_at , # type: ignore[arg-type]
948+ event_data = AssignmentReviewdEvent (
949+ assignment_id = delivery .course_content .assignment .id , # type: ignore[union-attr]
950+ assignment_title = delivery .course_content .assignment .title , # type: ignore[union-attr]
951+ review_result = ReviewResult (submission .status ), # type: ignore[union-attr]
952+ reviewed_by = submission .reviewer .display_name , # type: ignore[union-attr, arg-type]
953+ ),
954+ )
955+ )
900956 # TODO:events for reminders and submissions for assignments
901957
902958 if delivery .course_content .type == "quiz" :
0 commit comments