Esempio n. 1
0
    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)
Esempio n. 2
0
 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))