Skip to content

Commit

Permalink
feat: Update LearnerCourseEvent model and management command to track…
Browse files Browse the repository at this point in the history
… sent events.

* Add `already_sent` boolean field in `LearnerCourseEvent` model to store the state for sent events.
* Set `already_sent`` to `True` in `LearnerCourseEvent` model for each triggered event.
  • Loading branch information
muhammad-ammar committed Sep 6, 2022
1 parent 91b1fd0 commit 974763d
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 2 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ Unreleased
~~~~~~~~~~


[1.1.1] - 2022-09-06
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add `already_sent` boolean field in `LearnerCourseEvent` model to store the state for sent events.
* Set `already_sent`` to `True` in `LearnerCourseEvent` model for each triggered event.

[1.1.0] - 2022-07-14
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Make follow up days configurable
Expand Down
2 changes: 1 addition & 1 deletion outcome_surveys/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
Outcome Surveys.
"""

__version__ = '1.1.0'
__version__ = '1.1.1'

default_app_config = 'outcome_surveys.apps.OutcomeSurveysConfig' # pylint: disable=invalid-name
Original file line number Diff line number Diff line change
Expand Up @@ -59,19 +59,22 @@ def handle(self, *args, **options):
follow_up_events = LearnerCourseEvent.objects.filter(
follow_up_date=today,
event_type=SEGMENT_LEARNER_PASSED_COURSE_FIRST_TIME_EVENT_TYPE,
already_sent=False,
)

paginator = Paginator(follow_up_events, 500)
for page_number in paginator.page_range:
page = paginator.page(page_number)

triggered_event_record_ids = []
for follow_up_event in page:
if should_fire_event:
track(
follow_up_event.user_id,
SEGMENT_LEARNER_PASSED_COURSE_FIRST_TIME_FOLLOW_UP_EVENT_TYPE,
follow_up_event.data
)
triggered_event_record_ids.append(follow_up_event.id)

follow_up_event_ids.append(follow_up_event.id)

Expand All @@ -82,4 +85,7 @@ def handle(self, *args, **options):
follow_up_event.data
)

if triggered_event_record_ids:
LearnerCourseEvent.objects.filter(id__in=triggered_event_record_ids).update(already_sent=True)

log.info("%s Command completed. Segment event triggered for ids: [%s]", log_prefix, follow_up_event_ids)
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,18 @@ def setUp(self):
'follow_up_date': self.today,
'event_type': SEGMENT_LEARNER_PASSED_COURSE_FIRST_TIME_EVENT_TYPE,
},
{
'user_id': 222,
'course_id': self.course_id,
'data': {
'LMS_ENROLLMENT_ID': 2221,
'COURSE_TITLE': 'An introduction to Python',
'COURSE_ORG_NAME': 'PythonX',
},
'follow_up_date': self.today,
'event_type': SEGMENT_LEARNER_PASSED_COURSE_FIRST_TIME_EVENT_TYPE,
'already_sent': True,
},
{
'user_id': 300,
'course_id': self.course_id,
Expand All @@ -76,7 +88,7 @@ def construct_event_call_data(self):
"""
event_call_data = []
for item in self.test_data:
if item.get('follow_up_date') == self.today:
if item.get('follow_up_date') == self.today and item.get('already_sent', False) is False:
event_call_data.append([
item.get('user_id'),
SEGMENT_LEARNER_PASSED_COURSE_FIRST_TIME_FOLLOW_UP_EVENT_TYPE,
Expand All @@ -99,6 +111,19 @@ def test_command(self, segment_track_mock):
* Event should be fired for records having follow_up_date set to today.
"""
already_sent_records = LearnerCourseEvent.objects.filter(already_sent=True)
assert already_sent_records.count() == 1
assert already_sent_records.first().user_id == 222
already_sent_records_ids = list(already_sent_records.values_list('id', flat=True))

call_command(self.command)
expected_segment_event_calls = [mock.call(*event_data) for event_data in self.construct_event_call_data()]
segment_track_mock.assert_has_calls(expected_segment_event_calls)

# verify that correct records were upddated in table
already_sent_records = LearnerCourseEvent.objects.filter(already_sent=True)
assert already_sent_records.count() == 3
triggered_event_user_ids = already_sent_records.exclude(
id__in=already_sent_records_ids
).values_list('user_id', flat=True)
assert list(triggered_event_user_ids) == [100, 200]
18 changes: 18 additions & 0 deletions outcome_surveys/migrations/0002_learnercourseevent_already_sent.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.2.14 on 2022-08-18 09:08

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('outcome_surveys', '0001_initial'),
]

operations = [
migrations.AddField(
model_name='learnercourseevent',
name='already_sent',
field=models.BooleanField(default=False),
),
]
1 change: 1 addition & 0 deletions outcome_surveys/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class LearnerCourseEvent(TimeStampedModel):
choices=EVENT_CHOICES,
default=SEGMENT_LEARNER_PASSED_COURSE_FIRST_TIME_EVENT_TYPE,
)
already_sent = models.BooleanField(default=False)

class Meta:
"""
Expand Down

0 comments on commit 974763d

Please sign in to comment.