Skip to content

Commit a27c87a

Browse files
committed
fix MPP-4106: refactor(phone): update last_engagement on phone operations
1 parent 0751ac8 commit a27c87a

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed

phones/models.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from twilio.rest import Client
2323

2424
from emails.utils import incr_if_enabled
25+
from privaterelay.models import Profile
2526

2627
from .apps import phones_config, twilio_client
2728
from .iq_utils import send_iq_sms
@@ -295,7 +296,21 @@ def save(self, *args, **kwargs):
295296
# if this number exists for this user, this is an update call
296297
existing_numbers = RelayNumber.objects.filter(user=self.user)
297298
this_number = existing_numbers.filter(number=self.number).first()
299+
update_user_profile_last_engagement = False
298300
if this_number and this_number.id == self.id:
301+
update_user_profile_last_engagement = any(
302+
[
303+
self.enabled != this_number.enabled,
304+
self.calls_forwarded != this_number.calls_forwarded,
305+
self.calls_blocked != this_number.calls_blocked,
306+
self.texts_forwarded != this_number.texts_forwarded,
307+
self.texts_blocked != this_number.texts_blocked,
308+
]
309+
)
310+
if update_user_profile_last_engagement:
311+
profile: Profile = Profile.objects.get(user=self.user)
312+
profile.last_engagement = datetime.now(UTC)
313+
profile.save()
299314
return super().save(*args, **kwargs)
300315
elif existing_numbers.exists():
301316
raise ValidationError("User can have only one relay number.")

phones/tests/models_tests.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,16 @@ def upgrade_test_user_to_phone(user):
9999
return user
100100

101101

102+
def add_verified_realphone_to_user(phone_user: User):
103+
number = "+12223334444"
104+
return RealPhone.objects.create(
105+
user=phone_user,
106+
number=number,
107+
verification_sent_date=datetime.now(UTC),
108+
verified=True,
109+
)
110+
111+
102112
@pytest.fixture(autouse=True)
103113
def phone_user(db):
104114
return make_phone_test_user()
@@ -772,6 +782,89 @@ def test_save_store_phone_log_true_doesnt_delete_data() -> None:
772782
assert inbound_contact
773783

774784

785+
def _setup_phone_user_for_last_engagment(phone_user):
786+
add_verified_realphone_to_user(phone_user)
787+
relay_number = RelayNumber.objects.create(user=phone_user, number="+12223334444")
788+
789+
# Get initial last_engagement
790+
initial_last_engagement = phone_user.profile.last_engagement
791+
return relay_number, initial_last_engagement
792+
793+
794+
def test_relaynumber_save_updates_last_engagement(phone_user):
795+
"""
796+
Test that updating specific RelayNumber fields triggers last_engagement update.
797+
"""
798+
relay_number, initial_last_engagement = _setup_phone_user_for_last_engagment(
799+
phone_user
800+
)
801+
802+
# Update one of the tracked fields
803+
relay_number.calls_forwarded += 1
804+
relay_number.save()
805+
806+
# Check if last_engagement was updated
807+
phone_user.profile.refresh_from_db()
808+
assert phone_user.profile.last_engagement is not None
809+
810+
if initial_last_engagement:
811+
assert phone_user.profile.last_engagement > initial_last_engagement
812+
813+
814+
def test_relaynumber_save_no_update_when_other_fields_change(phone_user):
815+
"""
816+
Test that updating fields NOT in the tracked list does NOT update last_engagement.
817+
"""
818+
relay_number, initial_last_engagement = _setup_phone_user_for_last_engagment(
819+
phone_user
820+
)
821+
822+
# Update a field that is NOT in the tracked list
823+
relay_number.remaining_seconds -= 10
824+
relay_number.save()
825+
826+
# Ensure last_engagement was NOT updated
827+
phone_user.profile.refresh_from_db()
828+
assert phone_user.profile.last_engagement == initial_last_engagement
829+
830+
831+
def test_relaynumber_create_does_not_trigger_last_engagement(phone_user):
832+
"""
833+
Test that creating a new RelayNumber does NOT trigger last_engagement update.
834+
"""
835+
add_verified_realphone_to_user(phone_user)
836+
initial_last_engagement = phone_user.profile.last_engagement
837+
838+
RelayNumber.objects.create(user=phone_user, number="+12223334444")
839+
840+
# Ensure last_engagement was NOT updated
841+
phone_user.profile.refresh_from_db()
842+
assert phone_user.profile.last_engagement == initial_last_engagement
843+
844+
845+
def test_multiple_relaynumber_updates_trigger_last_engagement_once(phone_user):
846+
"""
847+
Test that multiple updates to a tracked field still updates last_engagement.
848+
"""
849+
relay_number, initial_last_engagement = _setup_phone_user_for_last_engagment(
850+
phone_user
851+
)
852+
853+
# Update multiple tracked fields
854+
relay_number.calls_forwarded += 1
855+
relay_number.calls_blocked += 1
856+
relay_number.texts_forwarded += 1
857+
relay_number.save()
858+
859+
# Check if last_engagement was updated
860+
phone_user.profile.refresh_from_db()
861+
862+
assert phone_user.profile.last_engagement is not None
863+
864+
if initial_last_engagement:
865+
assert phone_user.profile.last_engagement > initial_last_engagement
866+
867+
775868
def test_save_store_phone_log_false_deletes_data() -> None:
776869
user = make_phone_test_user()
777870
baker.make(RealPhone, user=user, verified=True)

0 commit comments

Comments
 (0)