def test_create_facility_location(self): with open(os.path.join(self.datapath, 'sample_locations.json')) as f: location = Location(json.loads(f.read())[1]) with open(os.path.join(self.datapath, 'sample_products.json')) as f: for p in json.loads(f.read()): self.api_object.product_sync(Product(p)) self.assertEqual(8, SQLProduct.objects.filter(domain=TEST_DOMAIN).count()) ewsghana_location = self.api_object.location_sync(location) self.assertEqual(ewsghana_location.name, location.supply_points[0].name) self.assertEqual(ewsghana_location.site_code, location.supply_points[0].code) self.assertEqual("Hospital", ewsghana_location.location_type) self.assertEqual(ewsghana_location.longitude, float(location.longitude)) self.assertEqual(ewsghana_location.latitude, float(location.latitude)) self.assertFalse(ewsghana_location.is_archived) sql_location = ewsghana_location.sql_location self.assertEqual(ewsghana_location.get_id, sql_location.location_id) self.assertEqual(int(sql_location.parent.external_id), location.parent_id) self.assertIsNotNone(sql_location.id) self.assertIsNotNone(sql_location.supply_point_id) supply_point = SupplyPointCase.get_by_location_id(TEST_DOMAIN, sql_location.location_id) self.assertIsNotNone(supply_point) self.assertEqual(supply_point.location, ewsghana_location) self.assertEqual(location.supply_points[0].id, int(supply_point.external_id)) self.assertEqual(location.supply_points[0].name, supply_point.name) self.assertSetEqual(set(location.supply_points[0].products), {product.code for product in ewsghana_location.sql_location.products})
def stock_data_task(domain, endpoint, apis, config, test_facilities=None): # checkpoint logic start_date = datetime.today() default_api = apis[0][0] try: checkpoint = StockDataCheckpoint.objects.get(domain=domain) api = checkpoint.api # legacy if api == 'product_stock': api = default_api date = checkpoint.date limit = checkpoint.limit offset = checkpoint.offset location = checkpoint.location if not checkpoint.start_date: checkpoint.start_date = start_date checkpoint.save() else: start_date = checkpoint.start_date except StockDataCheckpoint.DoesNotExist: checkpoint = StockDataCheckpoint() checkpoint.domain = domain checkpoint.start_date = start_date api = default_api date = None limit = 1000 offset = 0 location = None if not config.all_stock_data: facilities = test_facilities else: supply_points_ids = SQLLocation.objects.filter( domain=domain, location_type__in=get_reporting_types(domain) ).order_by('created_at').values_list('supply_point_id', flat=True) facilities = [doc['external_id'] for doc in iter_docs(SupplyPointCase.get_db(), supply_points_ids)] apis_from_checkpoint = itertools.dropwhile(lambda x: x[0] != api, apis) facilities_copy = list(facilities) if location: supply_point = SupplyPointCase.get_by_location_id(domain, location.location_id) external_id = supply_point.external_id if supply_point else None if external_id: facilities = itertools.dropwhile(lambda x: int(x) != int(external_id), facilities) for idx, (api_name, api_function) in enumerate(apis_from_checkpoint): api_function( domain=domain, checkpoint=checkpoint, date=date, limit=limit, offset=offset, endpoint=endpoint, facilities=facilities ) limit = 1000 offset = 0 # todo: see if we can avoid modifying the list of facilities in place if idx == 0: facilities = facilities_copy save_stock_data_checkpoint(checkpoint, default_api, 1000, 0, start_date, None, False) checkpoint.start_date = None checkpoint.save()
def get_last_processed_location(self, checkpoint): supply_point = SupplyPointCase.get_by_location_id(self.domain, checkpoint.location.location_id) external_id = supply_point.external_id if supply_point else None return external_id