def update_stock_state_for_transaction(instance): from corehq.apps.commtrack.models import StockState from corehq.apps.locations.models import SQLLocation from corehq.apps.products.models import SQLProduct # todo: in the worst case, this function makes # - three calls to couch (for the case, domain, and commtrack config) # - four postgres queries (transacitons, product, location, and state) # - one postgres write (to save the state) # and that doesn't even include the consumption calc, which can do a whole # bunch more work and hit the database. sql_product = SQLProduct.objects.get(product_id=instance.product_id) try: domain_name = instance.domain except AttributeError: domain_name = sql_product.domain domain = Domain.get_by_name(domain_name) try: sql_location = SQLLocation.objects.get( supply_point_id=instance.case_id) except SQLLocation.DoesNotExist: sql_location = None try: state = StockState.include_archived.get( section_id=instance.section_id, case_id=instance.case_id, product_id=instance.product_id, ) except StockState.DoesNotExist: state = StockState( section_id=instance.section_id, case_id=instance.case_id, product_id=instance.product_id, sql_product=sql_product, sql_location=sql_location, ) # we may not be saving the latest transaction so make sure we use that # todo: this should change to server date latest_transaction = StockTransaction.latest( case_id=instance.case_id, section_id=instance.section_id, product_id=instance.product_id) if latest_transaction != instance: logging.warning( 'Just fired signal for a stale stock transaction. Domain: {}, instance: {},latest was {}' .format(domain_name, instance, latest_transaction)) instance = latest_transaction state.last_modified_date = instance.report.date state.stock_on_hand = instance.stock_on_hand if domain and domain.commtrack_settings: consumption_calc = domain.commtrack_settings.get_consumption_config() else: consumption_calc = None state.daily_consumption = compute_daily_consumption( instance.case_id, instance.product_id, instance.report.date, 'stock', consumption_calc) # so you don't have to look it up again in the signal receivers if domain: state.domain = domain.name state.save()
def update_stock_state_for_transaction(instance): from corehq.apps.commtrack.models import StockState from corehq.apps.locations.models import SQLLocation from corehq.apps.products.models import SQLProduct # todo: in the worst case, this function makes # - three calls to couch (for the case, domain, and commtrack config) # - four postgres queries (transacitons, product, location, and state) # - one postgres write (to save the state) # and that doesn't even include the consumption calc, which can do a whole # bunch more work and hit the database. sql_product = SQLProduct.objects.get(product_id=instance.product_id) try: domain_name = instance.domain except AttributeError: domain_name = sql_product.domain domain = Domain.get_by_name(domain_name) try: sql_location = SQLLocation.objects.get(supply_point_id=instance.case_id) except SQLLocation.DoesNotExist: sql_location = None try: state = StockState.include_archived.get( section_id=instance.section_id, case_id=instance.case_id, product_id=instance.product_id, ) except StockState.DoesNotExist: state = StockState( section_id=instance.section_id, case_id=instance.case_id, product_id=instance.product_id, sql_product=sql_product, sql_location=sql_location, ) # we may not be saving the latest transaction so make sure we use that # todo: this should change to server date latest_transaction = StockTransaction.latest( case_id=instance.case_id, section_id=instance.section_id, product_id=instance.product_id ) if latest_transaction != instance: logging.warning( 'Just fired signal for a stale stock transaction. Domain: {}, instance: {},latest was {}'.format( domain_name, instance, latest_transaction ) ) instance = latest_transaction state.last_modified_date = instance.report.date state.stock_on_hand = instance.stock_on_hand if domain and domain.commtrack_settings: consumption_calc = domain.commtrack_settings.get_consumption_config() else: consumption_calc = None state.daily_consumption = compute_daily_consumption( domain_name, instance.case_id, instance.product_id, instance.report.date, 'stock', consumption_calc ) # so you don't have to look it up again in the signal receivers if domain: state.domain = domain.name state.save()