Esempio n. 1
0
def run():    
    reader = csv.reader(stdin)
    rows = iter(reader)
    header = rows.next()
    if tuple(header) != tuple(HEADER):
        raise Exception("incorrect header")
    patients_arr = []
    structure = (
        ('phone', 3, ('type', 'value')),
        ('address', 2, ('type', 'street', 'city', 'postal code', 'country')),
        ('provider', 9, ('type', 'number')),
    )
    def normalize(s):
        return s.lower().replace(' ',  '_')
    
    for row in rows:
        data = dict(zip(map(normalize, HEADER), row))
        patient_dict = dict()
        #for key in map(normalize, ('PACTID', 'Given Name', 'Family Name', 'CHW Membership')):
        for key in map(normalize, ('PACTID',
                                   'Given Name',
                                   'Family Name',
                                   'DOB',
                                   'Gender',
                                   'Arm',
                                   'HP',
                                   'ART Regimen',
                                   'Non-ART Regimen',
                                   'DOT - Sunday',
                                   'DOT - Monday',
                                   'DOT - Tuesday',
                                   'DOT - Wednesday',
                                   'DOT - Thursday',
                                   'DOT - Friday',
                                   'DOT - Saturday')):
            patient_dict[key] = data[key]
        for key, N, fields in structure:
            patient_dict[key] = []
            for i in range(1,N+1):
                format = "%s %d - %%s" % (key, i)                             
                patient_dict[key].append(tuple([data.get(normalize(format % f), '') for f in fields]))
        
        patients_arr.append(patient_dict)

#
#    # patients_arr = [{'pactid':123, 'phone':[{'type':...]}]
#    def get_user(first, last):
#        users = User.objects.filter(first_name=first_name, last_name=last_name)
#        if users.count():
#            if users.count() > 1:
#                print "Multiple users named %s %s" % (first_name, last_name)
#            # This is not a smart way to deal with two people with the same name
#            user = users[0]
#        else:
#            username = '******'.join(map(normalize, (first_name, last_name)))
#            while User.objects.filter(username=username):
#                username += '_'
#            user = User.objects.create_user(username, '', 'demo')
#            user.first_name = first_name
#            user.last_name = last_name
#            user.save()
#        return user
#
    for patient_dict in patients_arr:
        first_name, last_name = patient_dict['given_name'], patient_dict['family_name']
        #user = get_user(first_name, last_name)
        
        sex = patient_dict['gender'].lower()[0]
        dob = datetime.strptime(patient_dict['dob'], "%m/%d/%Y").date() #%m/%d/%Y
        pact_id = patient_dict['pactid']

        arm = patient_dict['arm']
        hp = patient_dict['hp']

        art_regimen = patient_dict['art_regimen']
        non_art_regimen = patient_dict['non-art_regimen']

        ptquerystring = last_name.lower() + first_name.lower() + dob.strftime("%Y-%m-%d")
        existing_pts = PactPatient.view("patient/search", key=ptquerystring, include_docs=True).count()

        if existing_pts > 0:
            print "Patient already exists, skipping"
            continue

        django_patient = Patient()
        django_patient.doc_id=None
        django_patient.save()

        cpatient = PactPatient(django_uuid=django_patient.id,
                            pact_id=pact_id,
                            first_name = first_name,
                            last_name=last_name,
                            middle_name = '',
                            gender = sex,
                            birthdate = dob,
                            art_regimen=art_regimen,
                            non_art_regimen=non_art_regimen,
                            primary_hp = hp,
                            arm = arm)


        raw_phones = patient_dict['phone']
        couched_phones = []
        addresses = patient_dict['address']
        couched_addresses = []
        #chw_membership = patient_dict['chw_membership']
        providers = patient_dict['provider']


        #pt_model.notes = str([chw_membership,providers])
        #pt_model.save()
#        patient_dict.user = user
#        patient_dict.sex="f"
#        patient_dict.save()

        for phone in raw_phones:
            ident = phone[0]
            val = phone[1]
            newphone = CPhone(description=ident, number=val, created=datetime.utcnow())
            cpatient.phones.append(newphone)

        for addr in addresses:            
            if addr[0] == '' and addr [1] == '' and addr[2] == '':
                continue
            newaddress = CAddress(type=addr[0], street=addr[1], city=addr[2], state="MA", postal_code=addr[3])
            cpatient.address.append(newaddress)

        days_of_week = ['sunday','monday','tuesday','wednesday','thursday','friday','saturday']
        for day in days_of_week:
            cschedule= CDotSchedule(day_of_week=day, hp_username=patient_dict['dot_-_%s' % day])
            cpatient.dots_schedule.append(cschedule)


        cpatient.save()
        django_patient.doc_id = cpatient._id
        django_patient.save()