Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 0 additions & 10 deletions apps/shipments/serializers/shipment.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
from collections import OrderedDict
from datetime import datetime, timezone

import requests
from django.conf import settings
from django.contrib.gis.geos import Point
from django.db import transaction
Expand Down Expand Up @@ -277,15 +276,6 @@ def validate_gtx_required(self, gtx_required):
raise PermissionDenied('User does not have access to enable GTX for this shipment')
return gtx_required

def validate_quickadd_tracking(self, quickadd_tracking):
response = requests.post(f'{settings.AFTERSHIP_URL}couriers/detect',
headers={'aftership-api-key': settings.AFTERSHIP_API_KEY},
json={'tracking': {'tracking_number': quickadd_tracking}})
if not response.ok:
raise serializers.ValidationError('Invalid quickadd_tracking value')

return quickadd_tracking


class ShipmentUpdateSerializer(ShipmentSerializer):
device_id = serializers.CharField(max_length=36, allow_null=True)
Expand Down
24 changes: 19 additions & 5 deletions apps/shipments/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,24 @@ def telemetrydata_post_save(sender, **kwargs):
dispatch_uid='shipment_quickadd_tracking_changed')
def shipment_quickadd_tracking_changed(sender, instance, changed_fields, **kwargs):
if instance.quickadd_tracking and settings.SNS_CLIENT:
response = requests.post(f'{settings.AFTERSHIP_URL}couriers/detect',
headers={'aftership-api-key': settings.AFTERSHIP_API_KEY},
json={'tracking': {'tracking_number': instance.quickadd_tracking}})
if not response.ok or not response.json()['data']['couriers']:
raise ValidationError('Invalid quickadd_tracking value')

slug = response.json()['data']['couriers'][0]['name']
log_metric(
'transmission.info',
tags={'method': 'shipments.quickadd_shipment', 'carrier_abbv': slug, 'module': __name__}
)

instance.anonymous_historical_change(
shippers_reference=f'Quickadd Shipment: {instance.quickadd_tracking}',
carrier_abbv=slug
)
instance.refresh_from_db(fields=['shippers_reference', 'carrier_abbv'])

response = requests.post(f'{settings.AFTERSHIP_URL}trackings',
json={'tracking': {'tracking_number': instance.quickadd_tracking}},
headers={'aftership-api-key': settings.AFTERSHIP_API_KEY})
Expand All @@ -177,15 +195,11 @@ def shipment_quickadd_tracking_changed(sender, instance, changed_fields, **kwarg

tracking_data = response.json()['data']['tracking']

log_metric(
'transmission.info',
tags={'method': 'shipments.quickadd_shipment', 'carrier_abbv': tracking_data['slug'], 'module': __name__}
)
instance.anonymous_historical_change(shippers_reference=f'Quickadd Shipment: {instance.quickadd_tracking}',
carrier_abbv=tracking_data['slug'])
instance.refresh_from_db(fields=['shippers_reference', 'carrier_abbv'])

SNSClient().aftership_tracking_update(instance, tracking_data['id'], instance.updated_by)
SNSClient().aftership_tracking_update(instance, tracking_data['id'])


@receiver(post_save_changed, sender=Shipment, fields=['device', 'state', 'geofences'],
Expand Down
7 changes: 4 additions & 3 deletions apps/sns.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@ def _publish(self, message_type, **kwargs):
}
)

def aftership_tracking_update(self, shipment, aftership_id, owner_id):
def aftership_tracking_update(self, shipment, aftership_id):
self._publish(
SNSClient.MessageType.AFTERSHIP_UPDATE,
ownerId=owner_id,
ownerId=shipment.updated_by,
aftershipTrackingId=aftership_id,
shipmentId=shipment.id
shipmentId=shipment.id,
carrierType=shipment.carrier_abbv
)

def shipment_update(self, shipment):
Expand Down
23 changes: 20 additions & 3 deletions tests/profiles_enabled/shipments/test_shipments.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,11 @@ def set_up(self, profiles_ids, mocked_engine_rpc):

@pytest.fixture
def mock_aftership_validation_succeess(self, mock_successful_wallet_owner_calls):
mock_successful_wallet_owner_calls.register_uri(mock_successful_wallet_owner_calls.POST,
f'{settings.AFTERSHIP_URL}couriers/detect',
)
mock_successful_wallet_owner_calls.register_uri(
mock_successful_wallet_owner_calls.POST,
f'{settings.AFTERSHIP_URL}couriers/detect',
body=json.dumps({'data': {'couriers': [{'name': 'aftership-slug'}]}}),
)
return mock_successful_wallet_owner_calls

@pytest.fixture
Expand All @@ -70,6 +72,15 @@ def mock_aftership_validation_failure(self, mock_successful_wallet_owner_calls):
)
return mock_successful_wallet_owner_calls

@pytest.fixture
def mock_aftership_validation_no_couriers(self, mock_successful_wallet_owner_calls):
mock_successful_wallet_owner_calls.register_uri(
mock_successful_wallet_owner_calls.POST,
f'{settings.AFTERSHIP_URL}couriers/detect',
body=json.dumps({'data': {'couriers': []}}),
)
return mock_successful_wallet_owner_calls

@pytest.fixture
def mock_aftership_create_success(self, mock_aftership_validation_succeess):
mock_aftership_validation_succeess.register_uri(
Expand Down Expand Up @@ -133,6 +144,12 @@ def test_quickadd_validation_fail(self, client_alice, mock_aftership_validation_
AssertionHelper.HTTP_400(response, error='Invalid quickadd_tracking value')
mock_aftership_validation_failure.assert_calls(assertions_aftership_validation)

def test_quickadd_no_couriers(self, client_alice, mock_aftership_validation_no_couriers,
assertions_aftership_validation):
response = client_alice.post(self.create_url, self.base_create_attributes)
AssertionHelper.HTTP_400(response, error='Invalid quickadd_tracking value')
mock_aftership_validation_no_couriers.assert_calls(assertions_aftership_validation)


class TestShipmentsList:
url = reverse('shipment-list', kwargs={'version': 'v1'})
Expand Down
17 changes: 14 additions & 3 deletions tests/profiles_enabled/shipments/test_sns.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,11 @@ def sqs_queue(boto_session, mocked_sns, settings):

@pytest.fixture
def mocked_aftership_api(modified_http_pretty, settings):
modified_http_pretty.register_uri(modified_http_pretty.POST, f'{settings.AFTERSHIP_URL}couriers/detect')
modified_http_pretty.register_uri(
modified_http_pretty.POST,
f'{settings.AFTERSHIP_URL}couriers/detect',
body=json.dumps({'data': {'couriers': [{'name': 'aftership-slug'}]}})
)
modified_http_pretty.register_uri(modified_http_pretty.POST, f'{settings.AFTERSHIP_URL}trackings',
body=json.dumps({'data': {'tracking': {'id': 'id-from-aftership', 'slug': 'aftership-slug'}}}),)

Expand All @@ -68,11 +72,18 @@ def test_sns_notifications(self, mocked_sns, sqs_queue, shipment, mocked_aftersh
shipment.quickadd_tracking = 'abc123'
shipment.save()

modified_http_pretty.assert_calls([{
modified_http_pretty.assert_calls([
{
'host': settings.AFTERSHIP_URL.replace('/v4/', ''),
'path': '/v4/couriers/detect',
'body': {'tracking': {'tracking_number': shipment.quickadd_tracking}}
},
{
'host': settings.AFTERSHIP_URL.replace('/v4/', ''),
'path': '/v4/trackings',
'body': {'tracking': {'tracking_number': shipment.quickadd_tracking}}
}])
}
])
messages = sqs_queue.receive_messages(MaxNumberOfMessages=2)
assert len(messages) == 2

Expand Down