def get_stock_actions(xform): if is_device_report(xform): return _empty_actions() stock_report_helpers = list(unpack_commtrack(xform)) transaction_helpers = [ transaction_helper for stock_report_helper in stock_report_helpers for transaction_helper in stock_report_helper.transactions ] if not transaction_helpers: return _empty_actions() # list of cases that had stock reports in the form case_ids = list(set(transaction_helper.case_id for transaction_helper in transaction_helpers)) user_id = xform.form['meta']['userID'] submit_time = xform['received_on'] case_action_intents = [] for case_id in case_ids: if is_deprecation(xform): case_action_intents.append(CaseActionIntent( case_id=case_id, form_id=xform.orig_id, is_deprecation=True, action=None )) else: case_action = CommCareCaseAction.from_parsed_action( submit_time, user_id, xform, AbstractAction(CASE_ACTION_COMMTRACK) ) case_action_intents.append(CaseActionIntent( case_id=case_id, form_id=xform._id, is_deprecation=False, action=case_action )) return StockFormActions(stock_report_helpers, case_action_intents)
def get_stock_actions(xform): if is_device_report(xform): return [], [] stock_report_helpers = list(unpack_commtrack(xform)) transaction_helpers = [ transaction_helper for stock_report_helper in stock_report_helpers for transaction_helper in stock_report_helper.transactions ] if not transaction_helpers: return [], [] # list of cases that had stock reports in the form case_ids = list(set(transaction_helper.case_id for transaction_helper in transaction_helpers)) user_id = xform.form['meta']['userID'] submit_time = xform['received_on'] case_actions = [] for case_id in case_ids: case_action = CommCareCaseAction.from_parsed_action( submit_time, user_id, xform, AbstractAction(CASE_ACTION_COMMTRACK) ) case_actions.append((case_id, case_action)) return stock_report_helpers, case_actions
def process_stock(xform, case_db=None): """ process the commtrack xml constructs in an incoming submission """ case_db = case_db or CaseDbCache() assert isinstance(case_db, CaseDbCache) if is_device_report(xform): return StockProcessingResult(xform) stock_report_helpers = list(unpack_commtrack(xform)) transaction_helpers = [ transaction_helper for stock_report_helper in stock_report_helpers for transaction_helper in stock_report_helper.transactions ] # omitted: normalize_transactions (used for bulk requisitions?) if not transaction_helpers: return StockProcessingResult(xform) # validate product ids if any(transaction_helper.product_id in ('', None) for transaction_helper in transaction_helpers): raise MissingProductId( _('Product IDs must be set for all ledger updates!')) # list of cases that had stock reports in the form # there is no need to wrap them by case type case_ids = list(set(transaction_helper.case_id for transaction_helper in transaction_helpers)) relevant_cases = [case_db.get(case_id) for case_id in case_ids] user_id = xform.form['meta']['userID'] submit_time = xform['received_on'] # touch every case for proper ota restore logic syncing to be preserved for case_id, case in zip(case_ids, relevant_cases): if case is None: raise IllegalCaseId( _('Ledger transaction references invalid Case ID "{}"') .format(case_id)) case_action = CommCareCaseAction.from_parsed_action( submit_time, user_id, xform, AbstractAction(CASE_ACTION_COMMTRACK) ) # hack: clear the sync log id so this modification always counts # since consumption data could change server-side case_action.sync_log_id = '' case.actions.append(case_action) case_db.mark_changed(case) return StockProcessingResult( xform=xform, relevant_cases=relevant_cases, stock_report_helpers=stock_report_helpers, )