def get_all_stock_report_helpers_from_form(xform): """ Given an instance of an AbstractXFormInstance, extract the ledger actions and convert them to StockReportHelper objects. """ form_xml = xform.get_xml_element() commtrack_node_names = ('{%s}balance' % COMMTRACK_REPORT_XMLNS, '{%s}transfer' % COMMTRACK_REPORT_XMLNS) def _extract_ledger_nodes_from_xml(node): """ Goes through a parsed XML document and recursively pulls out any ledger XML blocks. """ for child in node: if child.tag in commtrack_node_names: yield child else: for e in _extract_ledger_nodes_from_xml(child): yield e for elem in _extract_ledger_nodes_from_xml(form_xml): report_type, ledger_json = convert_xml_to_json( elem, last_xmlns=COMMTRACK_REPORT_XMLNS) if ledger_json.get('@date'): try: ledger_json['@date'] = adjust_text_to_datetime( ledger_json['@date']) except iso8601.ParseError: pass yield _ledger_json_to_stock_report_helper(xform, report_type, ledger_json)
def update_user_reporting_data(app_build_id, app_id, build_profile_id, couch_user, request): def _safe_int(val): try: return int(val) except: pass app_version = _safe_int(request.GET.get('app_version', '')) device_id = request.GET.get('device_id', '') last_sync_time = request.GET.get('last_sync_time', '') num_unsent_forms = _safe_int(request.GET.get('num_unsent_forms', '')) num_quarantined_forms = _safe_int( request.GET.get('num_quarantined_forms', '')) commcare_version = request.GET.get('cc_version', '') # if mobile cannot determine app version it sends -1 if app_version == -1: app_version = None try: last_sync = adjust_text_to_datetime(last_sync_time) except iso8601.ParseError: try: last_sync = string_to_utc_datetime(last_sync_time) except (ValueError, OverflowError): last_sync = None if settings.USER_REPORTING_METADATA_BATCH_ENABLED: UserReportingMetadataStaging.add_heartbeat( request.domain, couch_user._id, app_id, app_build_id, last_sync, device_id, app_version, num_unsent_forms, num_quarantined_forms, commcare_version, build_profile_id) else: record = UserReportingMetadataStaging( domain=request.domain, user_id=couch_user._id, app_id=app_id, build_id=app_build_id, sync_date=last_sync, device_id=device_id, app_version=app_version, num_unsent_forms=num_unsent_forms, num_quarantined_forms=num_quarantined_forms, commcare_version=commcare_version, build_profile_id=build_profile_id, last_heartbeat=datetime.utcnow(), modified_on=datetime.utcnow()) try: record.process_record(couch_user) except ResourceConflict: # https://sentry.io/dimagi/commcarehq/issues/521967014/ couch_user = CouchUser.get(couch_user.user_id) record.process_record(couch_user)
def update_user_reporting_data(app_build_id, app_id, couch_user, request): def _safe_int(val): try: return int(val) except: pass app_version = _safe_int(request.GET.get('app_version', '')) device_id = request.GET.get('device_id', '') last_sync_time = request.GET.get('last_sync_time', '') num_unsent_forms = _safe_int(request.GET.get('num_unsent_forms', '')) num_quarantined_forms = _safe_int(request.GET.get('num_quarantined_forms', '')) commcare_version = request.GET.get('cc_version', '') save_user = False # if mobile cannot determine app version it sends -1 if app_version and app_version > 0: save_user = update_latest_builds(couch_user, app_id, datetime.utcnow(), app_version) try: last_sync = adjust_text_to_datetime(last_sync_time) except iso8601.ParseError: try: last_sync = string_to_utc_datetime(last_sync_time) except (ValueError, OverflowError): last_sync = None else: save_user |= update_last_sync(couch_user, app_id, last_sync, app_version) app_meta = DeviceAppMeta( app_id=app_id, build_id=app_build_id, build_version=app_version, last_heartbeat=datetime.utcnow(), last_sync=last_sync, num_unsent_forms=num_unsent_forms, num_quarantined_forms=num_quarantined_forms ) save_user |= update_device_meta( couch_user, device_id, commcare_version=commcare_version, device_app_meta=app_meta, save=False ) if save_user: couch_user.save(fire_signals=False)
def update_user_reporting_data(app_build_id, app_id, couch_user, request): def _safe_int(val): try: return int(val) except: pass app_version = _safe_int(request.GET.get('app_version', '')) device_id = request.GET.get('device_id', '') last_sync_time = request.GET.get('last_sync_time', '') num_unsent_forms = _safe_int(request.GET.get('num_unsent_forms', '')) num_quarantined_forms = _safe_int( request.GET.get('num_quarantined_forms', '')) commcare_version = request.GET.get('cc_version', '') save_user = False # if mobile cannot determine app version it sends -1 if app_version and app_version > 0: save_user = update_latest_builds(couch_user, app_id, datetime.utcnow(), app_version) try: last_sync = adjust_text_to_datetime(last_sync_time) except iso8601.ParseError: try: last_sync = string_to_utc_datetime(last_sync_time) except (ValueError, OverflowError): last_sync = None else: save_user |= update_last_sync(couch_user, app_id, last_sync, app_version) app_meta = DeviceAppMeta(app_id=app_id, build_id=app_build_id, build_version=app_version, last_heartbeat=datetime.utcnow(), last_sync=last_sync, num_unsent_forms=num_unsent_forms, num_quarantined_forms=num_quarantined_forms) save_user |= update_device_meta(couch_user, device_id, commcare_version=commcare_version, device_app_meta=app_meta, save=False) if save_user: couch_user.save(fire_signals=False)