def task_get_data_from_spider(parcel_id): carrier = carrier_identify(parcel_id) if carrier: spider = eval(CARRIER_SPIDER[carrier.slug_name])(parcel_id, carrier.slug_name) else: spider = eval('GHNSpider')(parcel_id, 'ghn') result = spider.normalize() # create or update parcel by parcel_id parcel = result.get('parcel') parcel_obj, _ = Parcel.objects.get_or_create(parcel_id=parcel.get('parcel_id')) serializer = ParcelSerializer(parcel_obj, data=parcel, partial=True) serializer.is_valid() serializer.validated_data serializer.save() # get carrier carrier = result.get('carrier') carrier_obj = Carrier.objects.get(slug_name=carrier.get('slug_name')) # get or update event events = result.get('events_details') event_obj_list = [] for event in events: # can't use here because .data always valid and missing parcel # event_serializer = EventSerializer(data=event, partial=True) event_obj, _ = Event.objects.get_or_create(parcel=parcel_obj, carrier=carrier_obj, **event) event_obj_list.append(event_obj) events_serializer = EventNestedSerializer(event_obj_list, many=True) return events_serializer.data
def test_carrier_identify(self): parcel_id = 'EL745355158VN' carrier = carrier_identify(parcel_id) self.assertEqual(carrier.slug_name, 'vnpost', "Should return true parcel_id")