def handle(self, *args, **options): db = get_db() c = Consumer(db) log_file = settings.MANAGEMENT_COMMAND_LOG_FILE if settings.MANAGEMENT_COMMAND_LOG_FILE else settings.DJANGO_LOG_FILE init_file_logging(log_file, settings.LOG_SIZE, settings.LOG_BACKUPS, settings.LOG_LEVEL, settings.LOG_FORMAT) problem_patients = [] # keep this list so we don't get caught in an infinite loop def upgrade_patient(line): change = Change(line) # don't bother with deleted or old documents if change.deleted or not change.is_current(db): return patient_id = change.id try: if patient_id in problem_patients: return log_and_abort(logging.DEBUG, "skipping problem patient: %s" % patient_id) pat_data = get_db().get(patient_id, conflicts=True) # this is so we don't get conflicting updates. resolve conflicts before bumping version numbers. if "_conflicts" in pat_data: return log_and_abort(logging.INFO, "ignoring patient %s because there are still conflicts that need to be resolved" % patient_id) else: pat = CPatient.wrap(pat_data) if pat.requires_upgrade(): print "upgrading patient: %s" % patient_id logging.debug("upgrading patient: %s" % patient_id) if not reprocess(pat.get_id): log_and_abort(logging.ERROR, "problem upgrading patient %s!" % patient_id) problem_patients.append(patient_id) except Exception, e: logging.exception("problem upgrading patient (id: %s)" % patient_id) problem_patients.append(patient_id)
def handle(self, *args, **options): db = get_db() c = Consumer(db) log_file = settings.MANAGEMENT_COMMAND_LOG_FILE if settings.MANAGEMENT_COMMAND_LOG_FILE else settings.DJANGO_LOG_FILE init_file_logging(log_file, settings.LOG_SIZE, settings.LOG_BACKUPS, settings.LOG_LEVEL, settings.LOG_FORMAT) global max_seq max_seq = 0 def update_max_seq(change): global max_seq if change.seq > max_seq: max_seq = change.seq def add_form_to_patient(line): change = Change(line) # check the global max seq in this process to avoid repeating ourselves. if change.seq < max_seq: return log_and_abort(logging.DEBUG, "ignoring item %s because it's seq is old") update_max_seq(change) form_id = change.id # don't bother with deleted or old documents if change.deleted or not change.is_current(db): return formdoc = CXFormInstance.get(form_id) pat_id = get_patient_id_from_form(formdoc) if pat_id is not None and get_classification(formdoc.namespace) == "clinic": try: # this is so we don't get conflicting updates. # resolve conflicts and bump version numbers before adding forms pat_data = get_db().get(pat_id, conflicts=True) if "_conflicts" in pat_data: return log_and_abort(logging.INFO, "ignoring patient %s because there are still conflicts that need to be resolved" % pat_id) else: pat = CPatient.wrap(pat_data) if pat.requires_upgrade(): return log_and_abort(logging.INFO, "ignoring patient %s, form %s because it is not yet upgraded to the latest version" % (pat_id, form_id)) found_ids = [enc.xform_id for enc in pat.encounters] if form_id in found_ids and not formdoc.requires_upgrade(): return log_and_abort(logging.DEBUG, "Already found appropriate version of form %s in patient %s, no need to do anything" % (form_id, pat_id)) else: print "Form %s not found in patient %s or was old. Rebuilding the patient now" % (form_id, pat_id) reprocess(pat_id) except ResourceNotFound, e: return log_and_abort(logging.WARNING, "tried to check form %s in patient %s but patient has been deleted. Ignoring" % (form_id, pat_id))