def append(self, xml_element): self.num_items += 1 if isinstance(xml_element, bytes): xml_element, num = get_cached_items_with_count(xml_element) self.num_items += num - 1 self.response_body.write(xml_element) else: self.response_body.write(xml_util.tostring(xml_element))
def get_response(user, created): if created: text = "Thanks for registering! Your username is %s" % user.username else: text = "Thanks for updating your information, %s." % user.username nature = ResponseNature.SUBMIT_USER_REGISTERED if created else \ ResponseNature.SUBMIT_USER_UPDATED response = receiver_xml.get_response_element(text, nature=nature) response.append(phone_xml.get_registration_element(user.to_casexml_user())) return phone_xml.tostring(response)
def get_payload(self): user = self.user last_sync = self.sync_log self.validate() cached_payload = self.get_cached_payload() if cached_payload: return cached_payload sync_operation = user.get_case_updates(last_sync) case_xml_elements = [ xml.get_case_element(op.case, op.required_updates, self.version) for op in sync_operation.actual_cases_to_sync ] commtrack_elements = self.get_stock_payload(sync_operation) last_seq = str(get_db().info()["update_seq"]) # create a sync log for this previous_log_id = last_sync.get_id if last_sync else None synclog = SyncLog( user_id=user.user_id, last_seq=last_seq, owner_ids_on_phone=user.get_owner_ids(), date=datetime.utcnow(), previous_log_id=previous_log_id, cases_on_phone=[CaseState.from_case(c) for c in sync_operation.actual_owned_cases], dependent_cases_on_phone=[CaseState.from_case(c) for c in sync_operation.actual_extended_cases], ) synclog.save(**get_safe_write_kwargs()) # start with standard response response = get_response_element( "Successfully restored account %s!" % user.username, ResponseNature.OTA_RESTORE_SUCCESS ) # add sync token info response.append(xml.get_sync_element(synclog.get_id)) # registration block response.append(xml.get_registration_element(user)) # fixture block for fixture in generator.get_fixtures(user, self.version, last_sync): response.append(fixture) # case blocks for case_elem in case_xml_elements: response.append(case_elem) for ct_elem in commtrack_elements: response.append(ct_elem) if self.items: response.attrib["items"] = "%d" % len(response.getchildren()) resp = xml.tostring(response) self.set_cached_payload_if_enabled(resp) return resp
def get_xml_for_response(update, restore_state): """ Adds the XML from the case_update to the restore response. If factor is > 1 it will append that many updates to the response for load testing purposes. """ current_count = 0 original_update = update elements = [] while current_count < restore_state.loadtest_factor: element = get_case_element(update.case, update.required_updates, restore_state.version) elements.append(tostring(element)) current_count += 1 if current_count < restore_state.loadtest_factor: update = transform_loadtest_update(original_update, current_count) # only add user case on the first iteration if original_update.case.type == USERCASE_TYPE: break return elements
def append(self, xml_element): self.num_items += 1 if isinstance(xml_element, basestring): self.response_body.write(xml_element) else: self.response_body.write(xml.tostring(xml_element))
def test_generate_xml(self): casedb_xml = xml.tostring(xml.get_casedb_element(self.case)) self.assertXmlEqual(casedb_xml, self.get_xml('case_db_block'))
def __str__(self): if self.items: self.response.attrib['items'] = '%d' % len(self.response.getchildren()) return xml.tostring(self.response)
def get_registration_xml(restore_user): return xml.tostring(xml.get_registration_element(restore_user))
response.append(xml.get_sync_element(synclog.get_id)) # registration block response.append(xml.get_registration_element(user)) # fixture block for fixture in generator.get_fixtures(user, self.version, last_sync): response.append(fixture) # case blocks for case_elem in case_xml_elements: response.append(case_elem) for ct_elem in commtrack_elements: response.append(ct_elem) if self.items: response.attrib['items'] = '%d' % len(response.getchildren()) resp = xml.tostring(response) self.set_cached_payload_if_enabled(resp) return resp def get_response(self): try: return HttpResponse(self.get_payload(), mimetype="text/xml") except RestoreException, e: logging.exception("%s error during restore submitted by %s: %s" % (type(e).__name__, self.user.username, str(e))) response = get_simple_response_xml( e.message, ResponseNature.OTA_RESTORE_ERROR ) return HttpResponse(response, mimetype="text/xml", status=412) # precondition failed
def get_registration_xml(restore_user): return xml.tostring(xml.get_registration_element(restore_user)).decode('utf-8')
def generate_restore_payload(user, restore_id="", version="1.0", state_hash=""): """ Gets an XML payload suitable for OTA restore. If you need to do something other than find all cases matching user_id = user.user_id then you have to pass in a user object that overrides the get_case_updates() method. It should match the same signature as models.user.get_case_updates(): user: who the payload is for. must implement get_case_updates restore_id: sync token version: the CommCare version returns: the xml payload of the sync operation """ check_version(version) last_sync = None if restore_id: try: last_sync = SyncLog.get(restore_id) except Exception: logging.error("Request for bad sync log %s by %s, ignoring..." % (restore_id, user)) if last_sync and state_hash: parsed_hash = CaseStateHash.parse(state_hash) if last_sync.get_state_hash() != parsed_hash: raise BadStateException(expected=last_sync.get_state_hash(), actual=parsed_hash, case_ids=last_sync.get_footprint_of_cases_on_phone()) sync_operation = user.get_case_updates(last_sync) case_xml_elements = [xml.get_case_element(op.case, op.required_updates, version) \ for op in sync_operation.actual_cases_to_sync] last_seq = get_db().info()["update_seq"] # create a sync log for this previous_log_id = last_sync.get_id if last_sync else None synclog = SyncLog(user_id=user.user_id, last_seq=last_seq, owner_ids_on_phone=user.get_owner_ids(), date=datetime.utcnow(), previous_log_id=previous_log_id, cases_on_phone=[CaseState.from_case(c) for c in \ sync_operation.actual_owned_cases], dependent_cases_on_phone=[CaseState.from_case(c) for c in \ sync_operation.actual_extended_cases]) synclog.save() # start with standard response response = get_response_element( "Successfully restored account %s!" % user.username, ResponseNature.OTA_RESTORE_SUCCESS) # add sync token info response.append(xml.get_sync_element(synclog.get_id)) # registration block response.append(xml.get_registration_element(user)) # fixture block for fixture in generator.get_fixtures(user, version, last_sync): response.append(fixture) # case blocks for case_elem in case_xml_elements: response.append(case_elem) return xml.tostring(response)